Qt基本控件及三大布局

2023-10-26

Qt基本模块

一、Qt的三大布局

  1. QHBoxLayout:
    水平显示布局,所有在其上面摆放的控件只能水平排列下去;
  2. QVBoxLayout:
    垂直显示布局,所有在其上面摆放的控件只能垂直排列下去;
  3. QGridLayout
    格子显示布局,可以按照表格的形式显示布局;

文章最后为大家准备了Qt资料
↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

二、Qt的控件

  1. label:标签,可以显示文本信息,只读;
  2. pushbutton : 普通按钮;
  3. radiobutton : 单选按钮,多个单选按钮中只能选择一个,但是必须放入groupbox中,类似单选题;
  4. checkbox : 多选复选按钮,可以选择同时选择多个,类似多选题;
  5. lineedit : 单行文本编辑框,可以输入单行文本;
  6. textedit : 多行文本输入框,可以输入显示多行文本和图片;
  7. combobox : 下拉文本输入框,在输入框的最右边有个三角下拉按钮,可以选择输入,也可以手动输入;
  8. textbrower : 多行文本显示框,只读;
  9. groupbox : 可以在里面放入特点的东西,统一管理;
  10. slider : 模拟显示滑动条;
  11. spinbox : 数值显示滑动条;
  12. dateedit :
  13. timeedit :
  14. datetimeedit :
  15. lcdnumber :

三、Qt的信号槽

  1. 在Qt中所有的对象(继承QObject类)都有connect函数,只要有这个函数就能建立信号槽(通过触发某个控件的信号函数,执行槽中相应的函数);(暂时这样理解,还是有点理解不全面的,之后学习到再来修改);
  2. 在Qt中信号槽中可以使用自带的函数,四个参数;也可以执行自定义的函数,三个参数;具体看下面test4的例子就明白了。
#include <QtWidgets/QApplication>
#include <QtCore/qdebug.h>
#include <QtWidgets/qcompleter.h>
#include <QtWidgets/qlineedit.h>
#include <QtWidgets/qlabel.h>
#include <QtWidgets/qcombobox.h>
#include <QtWidgets/qcheckbox.h>
#include <QtWidgets/qradiobutton.h>
#include <QtWidgets/qtextedit.h>
#include <QtWidgets/qtextbrowser.h>
#include <QtWidgets/qgroupbox.h>
#include <QtWidgets/qslider.h>
#include <QtWidgets/qspinbox.h>
#include <QtWidgets/qdatetimeedit.h>
#include <QtWidgets/qtabwidget.h>
#include <QtWidgets/qlcdnumber.h>
#include <QtGui/qpixmap.h>
#include <QtCore/qobject.h>
#include <QtWidgets/qboxlayout.h>
#include <QtWidgets/qpushbutton.h>
#include "MyWidgetEvent.h"


void test() ;


int main(int argc, char *argv[]) {

    QApplication a(argc, argv);

    test() ;

    return a.exec();
}


void test(){


}


void test5ManyKongJian() {

    QWidget *nanWidget = new QWidget() ;
    QVBoxLayout *nanVLayout = new QVBoxLayout() ;

    /*
    **测试label控件
    */
    QLabel *label=nullptr ;
    nanVLayout->addWidget( label = new QLabel("<a href=www.baidu.com>baidu</a>") ) ;
    //QPixmap me("./me.png") ;
    //label->setPixmap( me ) ;//问题:链接和图片重复了,怎么分开
    label->setWordWrap( true ) ;
    label->adjustSize() ;
    nanVLayout->connect( label , &QLabel::linkActivated , []( QString str){
        qDebug()<<str ;
    } ) ;
    /*
    **测试lineedit控件
    */
    QLineEdit *lineEdit ;
    nanVLayout->addWidget( lineEdit = new QLineEdit("hello") ) ;
    /*
    **测试button控件
    */
    QPushButton *button ;
    nanVLayout->addWidget( button = new QPushButton("???") ) ;
    button->setStyleSheet("QPushButton {font:bold 16px; color:red;padding:5px}") ;
    nanWidget->connect( button , &QPushButton::clicked , [](bool flag){
        qDebug()<< "button" ;
    }) ;
    /*
    **测试radiobutton控件
    */
    QRadioButton *radioButton ;
    nanVLayout->addWidget( radioButton = new QRadioButton("qradiobutton") ) ;
    radioButton->setStyleSheet("QRadioButton {font:bold  16px;color:blue;padding:5px}") ;
    radioButton->connect( radioButton , &QRadioButton::clicked , [](bool flag){
        qDebug()<< flag ;
    }) ;
    /*
    **测试ckeckbox控件
    */
    QCheckBox *check ;
    nanVLayout->addWidget( check = new QCheckBox("chekcbox") ) ;
    /*
    **测试combobox控件
    */
    QComboBox *combobox ;
    nanVLayout->addWidget( combobox = new QComboBox() ) ;
    combobox->addItem("select item1") ;
    combobox->addItem("select item2") ;
    combobox->addItem("...  ...") ;
    combobox->setEditable(true) ;
    lineEdit->setText("start") ;
    combobox->connect( combobox , SIGNAL(activated(const QString &)) , lineEdit , SLOT(setText(const QString &)) ) ;//这里的下标要跟着显示
    combobox->setCompleter( new QCompleter(combobox->model()) ) ;
    /*
    **测试textedit
    */
    QTextEdit *textEdit ;
    nanVLayout->addWidget( textEdit = new QTextEdit("textedit") ) ;
    textEdit->setText("<table border=2> "
                    "<tr><td>good</td><td>good</td><td>good</td></tr>"
                    "<tr><td>nice</td><td>nice</td><td>nice</td></tr>"
                    "</table>"
                    "<img src=./me.png></img>") ;
    textEdit->connect( textEdit , &QTextEdit::textChanged,[&](){
        //问题:textEdit->toPlainText() ;怎么才能获取到textEdit的实体,this->sender()
        //QTextEdit _edit = (QTextEdit *)QObject::sender();
        qDebug()<<textEdit->toPlainText() ;
    }) ;
    textEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded) ;
    textEdit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn) ;
    /*
    **测试groupbox控件
    */
    QGroupBox *groupBox ;
    nanVLayout->addWidget( groupBox = new QGroupBox("groupbox") ) ;
    QHBoxLayout *hLayout ;
    groupBox->setLayout( hLayout = new QHBoxLayout() ) ;
    hLayout->addWidget( new QRadioButton("boy") ) ;
    hLayout->addWidget( new QRadioButton("girl") ) ;
    /*
    **测试模拟显示条slider
    */
    QSlider *slider ;
    nanVLayout->addWidget( slider = new QSlider() ) ;
    slider->setMinimum( -100 ) ;
    slider->setMaximum( 100 ) ;
    /*
    **测试数字显示条
    */
    QSpinBox *spinBox ;
    nanVLayout->addWidget( spinBox = new QSpinBox() ) ;
    spinBox->setMinimum( -100 ) ;
    spinBox->setMaximum( 100 ) ;
    slider->connect( slider , SIGNAL(valueChanged(int)) , spinBox , SLOT(setValue(int)) ) ;
    spinBox->connect( spinBox , SIGNAL(valueChanged(int)) , slider , SLOT(setValue(int)) ) ;
    /*
    **测试时间设置
    */
    nanVLayout->addWidget( new QDateTimeEdit() ) ;
    /*
    **测试显示时间,只读
    */
    QLCDNumber *number ;
    nanVLayout->addWidget( number = new QLCDNumber() ) ;
    number->display("1314") ;
    number->setMode(QLCDNumber::Hex) ;
    number->setSegmentStyle(QLCDNumber::Filled) ;

    nanWidget->setLayout( nanVLayout ) ;
    nanWidget->setWindowTitle("control") ;
    nanWidget->show() ;
}


void test4GridAndHBox() {

    QWidget *nanWidget = new QWidget() ;
    QGridLayout *nanGridLayout = new QGridLayout() ;
    QHBoxLayout *nanHBoxLayout = new QHBoxLayout() ;

    nanGridLayout->addWidget( new QLabel("Username") , 1 , 1 ) ;
    nanGridLayout->addWidget( new QLineEdit() , 1 , 2 ) ;
    nanGridLayout->addWidget( new QLabel("Username") , 2 , 1 ) ;
    nanGridLayout->addWidget( new QLineEdit() , 2 , 2 ) ;
    nanGridLayout->addLayout( nanHBoxLayout , 3 , 2 ) ;

    nanHBoxLayout->addStretch(1) ;
    nanHBoxLayout->addWidget( new QPushButton("Login") , 1 ) ;

    nanWidget->setLayout( nanGridLayout ) ;
    nanWidget->show() ;
}


void test3GridLayout() {

    QWidget *nanWidget = new QWidget() ;
    QGridLayout *nanLayout = new QGridLayout() ;
    QPushButton *nanButton = new QPushButton() ;
    QLineEdit *nanLineEdit = new QLineEdit() ;

    nanLayout->addWidget( nanLineEdit , 1 , 1 , 1 , 2 ) ;
    nanLayout->addWidget( new QPushButton , 1, 3 ) ;
    nanLayout->addWidget( new QLineEdit , 2, 1 , 2 , 1  ) ; 
    nanLayout->addWidget( new QPushButton , 2, 2 ) ;
    nanLayout->addWidget( new QPushButton , 2, 3 ) ;
    nanLayout->addWidget( nanButton , 3 , 3 ) ;
    nanLayout->setColumnStretch( 1 , 1 ) ;
    nanLayout->setColumnStretch( 2 , 1 ) ;/*设置每列的比重*/
    nanLayout->setColumnStretch( 3 , 1 ) ;

    nanWidget->setLayout( nanLayout ) ;
    nanWidget->show() ;
}


void test2HBoxLayout() {

    QWidget *nanQWidget = new QWidget() ;

    QLineEdit *nanQLineEdit = new QLineEdit() ;

    QHBoxLayout *nanHLayout = new QHBoxLayout() ;
    nanHLayout->addWidget( nanQLineEdit , 1 ) ;
    //添加,两个控件之间的距离addspaceing,两个控件在layout中的比重addstretch

    nanQWidget->setLayout( nanHLayout ) ;
    nanQWidget->show() ;
} 


void test1(){

    QWidget *w  = new QWidget ;
    QVBoxLayout *vLayout = new QVBoxLayout( ) ;
    QPushButton *nanButton ;
    QLineEdit *nanLineEdit ;
    QLabel *nanLabel ;
    QString content("null") ;
    QCompleter nanQCompleter( QStringList()<<"nich"<<"chen"<<"good") ;

    vLayout->addWidget( nanLineEdit = new QLineEdit()  ) ;
    vLayout->addWidget( nanButton = new QPushButton("right") ) ;
    nanQCompleter.setFilterMode( Qt::MatchFlag::MatchContains ) ;
    nanLineEdit->setCompleter( &nanQCompleter ) ;
    nanLineEdit->setPlaceholderText( "Please input your name" ) ;
    vLayout->addWidget(  nanLabel = new QLabel() ) ;
    nanLabel->setText( content ) ;
    w->connect( nanButton , &QPushButton::clicked , [&](){
        nanLabel->setText( nanLineEdit->text() ) ;
    } ) ;

    w->setLayout( vLayout) ;
    w->show() ;
}

一、dialog、widget、mainwindow的区别

1)、dialog有exec函数,如果是dialog窗口,后边的窗口时不可选的;
2)、widget和dialog都有show函数,如果通过这个函数显示这两种类型的窗口,则两个窗口都是可选的;
3)、widget主要是在上面放置布局和控件;
4)、mainwindow可以显示菜单,工具栏,状态栏、托盘等功能。

二、dialog窗口

这个dialog窗口只是为了给人们提供更好的可视化操作,但是对于程序员而言,这个操作并不是立刻执行的;而是当在窗口选择关闭后,才将选择的结果返回给后台,后台才可以根据选择的结果进行相应的操作。

#include "mydialog.h"


mydialog::mydialog(QDialog *parent):QDialog(parent) { 

    QPushButton *button = new QPushButton( "button" , this ) ;
    connect( button , SIGNAL(clicked()) , this , SLOT(slotButtonClick()) ) ;
}


void mydialog::slotButtonClick() {

#if 0
    /*dialog和widget的区别,exec和show的区别而已*/
    QDialog *dlg = new QDialog ;
    QPushButton *button = new QPushButton("close" , dlg ) ;
    connect( button , SIGNAL(clicked()) , dlg , SLOT(reject()) ) ;
    int ret = dlg->exec( ) ;
    //通过exec显示出来的窗口称为,模块对话框
    // 在模块对话框中,exec有自己的消息循环,并且把app的消息循环接管了
    // 如果Dialog是通过exec来显示,那么可以通过accept或者reject来关闭窗口
    // 如果Dialog是通过show来显示,那么可以通过close来关闭窗口,这个和QWidget一样的

    // 有许多特殊的dailog:文件选择,MessageBox,颜色选择,字体选择,打印预览,打印
    if( ret == QDialog::Accepted ) 
        qDebug()<<"accepted" ;
    else if( ret== QDialog::Rejected ) 
        qDebug()<<"rejected" ;
#endif 
#if 0
/*文件选择:这个窗口可以选择保存文件的名称,然后将路径+名称返回,我们就可以根据返回路径名来保存文件。*/
    QString strFilename = QFileDialog::getSaveFileName(NULL,
                                                       "Select file for save",
                                                       _strDir,
                                                        "pic file (*.png *.jpg)");
#endif 
#if 0
/*文件选择:选择要打开的文件名(绝对路劲);我们就可以根据这个文件路径来打开相应的文件*/
    QString strFilename = QFileDialog::getOpenFileName(NULL,
                                                       "Select file for open",
                                                       _strDir,
                                                     "pic file (*.png *.jpg)");
#endif
#if 0
    QString strFilename = QFileDialog::getExistingDirectory();

    if(strFilename.isEmpty())
    {
        qDebug() << "select none";
        return;
    }

    qDebug() << strFilename;
    QFileInfo fileInfo(strFilename);
    _strDir = fileInfo.filePath();
    qDebug() << _strDir;
#endif
    //do something for io ... ...
    //上面的选择将绝对路径名都给拿下来了,如果要进行保存,不是很容易吗!
    QPixmap pixmap(this->size()) ;
    QPainter painter(&pixmap) ;
    this->render( &painter ) ;
    pixmap.save(strFilename) ;
#if 0
/*颜色选择对话框:可以选择相应的颜色;然后将选择的颜色返回,这样我们就可以操作了*/
    QColorDialog colorDia ;
    colorDia.exec() ;
    QColor c = colorDia.selectedColor() ;
#endif
#if 0
/*字体选择对话框:可以选择字体;然后将选择的字体信息返回,我们同样可以用这些信息来设置相应的值*/
    QFontDialog fontDia ;
    fontDia.exec() ;
    QFont font = fontDia.selectedFont() ;
#endif
#if 0
/*这个也是弹窗对话框,不过只是简单的选择以下枚举中的值,可以尝试下效果*/
     int ret = QMessageBox::question(this, "????", "realy do .......",
                                    QMessageBox::Yes| QMessageBox::No|
                                    QMessageBox::YesAll| QMessageBox::NoAll);
    if(ret == QMessageBox::Yes)
    {
        qDebug() << "user select yes";
    }
    if(ret == QMessageBox::No)
    {
        qDebug() << "user select no";
    }
    #endif
}


void mydialog::paintEvent( QPaintEvent *ev ) {
}


mydialog::~mydialog(void) { }

三、widget窗口

前面已经介绍过很多继承这个窗口的控件了,这里就不再累述。

四、mainWindow窗口

这个也是给人们提供更好的可视化操作;
一个正常window软件呈现给客户的可视化界面;
包括:menu菜单、tool工具栏、status状态栏、电脑显示屏右下脚的托盘等。

#include "MyWindow.h"


MyWindow::MyWindow(QMainWindow *parent):QMainWindow( parent ) { 

    /*menuBar菜单栏,菜单menu*/
    QMenuBar  *menuBar = this->menuBar() ;
    _menu = menuBar->addMenu( "&File" ) ;
    QMenu *edit = menuBar->addMenu( "&Edit" ) ;

    /*menu菜单中的选项action*/
    QAction *openAction = _menu->addAction( "&Open"
        , this , SLOT(slotOpen()) , QKeySequence::Open  ) ;
    QAction *saveAction = _menu->addAction( "&Save"
        , this , SLOT(slotOpen()) , QKeySequence::Save  ) ;
    _menu->addSeparator() ;//添加分界线
    QAction *closeAction = _menu->addAction( "&Exit"
        , this , SLOT(close()) , QKeySequence::Close  ) ;

    /*toolBar工具栏*/
    QToolBar *toolBar = this->addToolBar( "mimi" ) ;
    toolBar->addAction( openAction ) ;
    toolBar->addAction( saveAction ) ;
    toolBar->addAction( closeAction ) ;
    /*statusBar状态栏*/
    QStatusBar *statusBar = this->statusBar() ;
    QLabel *label ;
    statusBar->addWidget( label = new QLabel("Ok") ) ;
    label->setText( "<font color=blue>XXXXX... ...</font>" ) ;
    /*上面的三种栏介绍完之后,剩下的窗口区域就是CentralWidget
    **如果将widget直接add到mainwindow这个窗口的话,
    **toolbar是会跟添加进来的widget重叠的*/
    MyView *view = new MyView ;
    this->setCentralWidget( view ) ;
    /*最后就是window系统右下脚的托盘:system tray icon*/
    QSystemTrayIcon *icon = new QSystemTrayIcon ;
    icon->setIcon( QIcon("./1.png") ) ;//图标
    icon->setToolTip( "luck dog" ) ;//鼠标滑过提示文字
    icon->show() ;//展示在右下角
    icon->setContextMenu( _menu ) ;//右击出现的菜单
    this->connect( icon , SIGNAL( slotActivated(QSystemTrayIcon::ActivationReason) ) 
        , this , SLOT(slotActivated(QSystemTrayIcon::QSystemTrayIcon::ActivationReason)) ) ;
    this->installEventFilter(this);
}


void MyWindow::slotActivated(QSystemTrayIcon::ActivationReason reason){

    /*这个没成功*/
    if( reason==QSystemTrayIcon::Trigger ) {
        if( this->isHidden() ) 
            this->show() ;
        else
            this->hide() ;
    }
}


bool MyWindow::eventFilter(QObject *o, QEvent *e)
{
    /*实现什么功能呢?*/
    if(o == (QObject*)this && e->type() == QEvent::Close)
    {
        return true;
    }

    return QMainWindow::eventFilter(o, e);
}


void MyWindow::slotOpen() {

    QString fileName = QFileDialog::getOpenFileName() ;
    qDebug()<<fileName ;
    /*将打开的文件中的内容显示在窗口上... ...*/
}
bool MyWindow::event(QEvent *ev)
{
    qDebug() << ev;
    if(ev->type() == QEvent::Close)  {
        return false;
    }
    /*怎么弄才能实现窗口关闭,托盘还在?*/
    return QMainWindow::event(ev);
}


void MyWindow::paintEvent( QPaintEvent * ) {

    QPainter painter(this) ;
    painter.drawPixmap( QPoint(0,0) , QPixmap("./1.png") ) ;
}


void MyWindow::mousePressEvent( QMouseEvent *ev ) {

    if( ev->button() == Qt::RightButton ) {
        _menu->exec( QCursor::pos() ) ;
    }
}


MyWindow::~MyWindow(void) { }

一、qDebug()函数

  1. qDebug()函数可以直接输出调试错误信息,方便程序员调试信息,查找错误;
  2. 例子:qDebug()<<"error"<<endl;

二、QDebug类

  1. 这个函数可以收集错误信息,通过QTextStream这个类(之前在写文件的时候,用过这个类,查看了下函数的作用,果真和自己想的一样);
  2. QTextStream类,指定一个Qfile*或是QString*作为参数,重载了<<操作符,将对象(QTextStream<<。。)收集到的数据都保存入,相应的参数(这个参数由构造函数决定)中,方便统一管理。例如:在构造时如果指定了文件指针,就直接保存如文件;在构造时如果指定了string,就直接保存如string中… …
  3. 总结:这个错误类不是用来输出信息的(当然简介使用错误函数也是可以输出信息),更重要的是用来收集错误信息,方便统一管理,保存,查看的。
    QString *str ;
    QDebug q( str = new QString("object") ) ;
    q<<"nice";
    qDebug()<< *str ;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt基本控件及三大布局 的相关文章

  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • java基础面试题系列(81-90)

    请你说明ConcurrentHashMap有什么优势 1 7和1 8有什么区别 参考链接 https www cnblogs com like minded p 6805301 html 请你说明一下TreeMap的底层结构 TreeMap
  • 第十篇 -- Windows 下免费的GIF录制工具

    网址 https blog csdn net u013019701 article details 80550411 本人用的第二个 亲测好用 转载于 https www cnblogs com smart zihan p 11461101
  • [CISCN2019 华北赛区 Day2 Web1]Hack World

    1 测试过滤 我想到到了 联合注入 unin被过滤 报错注入 and or updatexml被过滤 bool注入和time注入 and or被过滤 可以通过fuzz测试 模糊测试 发现哪些字符被过滤了 length为482的 全都是被过滤
  • LLVM编译流程

    LLVM概述 LLVM是构架编译器 compliter 的框架系统 以C 编写而成 用于优化以任意程序语言编写的程序的便是时间 compile time 链接时间 link time 运行时间 run time 以及空闲时间 idle ti
  • 网络编程--TCP/IP协议

    参考 https lijie blog csdn net article details 105297532 https blog csdn net qq 20785973 article details 83104695 https bl
  • 华为OD机试 - 分苹果(Python)

    题目描述 A B两个人把苹果分为两堆 A希望按照他的计算规则等分苹果 他的计算规则是按照二进制加法计算 并且不计算进位 12 5 9 1100 0101 9 B的计算规则是十进制加法 包括正常进位 B希望在满足A的情况下获取苹果重量最多 输
  • JJWT三种算法的工具类实现

    前言 最近学习jwt生成token 一直各种报错 不知道怎么生成对应的秘钥 周末研究了一下 把jjwt的HMAC RSA ECDSA三种签名算法方式都实现了 并记录下来 依赖版本如下
  • 波场链通过Tron JS SDK TronWeb发送带备注的TRC - 20 转账及使用简介

    波场链通过tronWeb发送带备注的TRC 20 转账 var contractAddress TRC 20 合约 选择合约 法 let functionSelector transfer address uint256 根据 法构造参数
  • 应对程序员面试,你必须知道的八大数据结构

    大数据文摘出品 编译 Hope 睡不着的iris 胡笳 云舟 瑞士计算机科学家Niklaus Wirth在1976年写了一本书 名为 算法 数据结构 编程 40多年后 这个等式仍被奉为真理 这就是为什么在面试过程中 需要考察软件工程师对数据
  • java在大量增强for循环中找到某个特定对象去分析的方法-推荐使用debug工具(idea为例)

    场景 代码中有一部分增强for循环 里面是很复杂的处理逻辑 并且处理的AObjectList列表数量非常大 在这串代码中想看一下某个name为 小白 的对象的处理过程 如果断点直接打在for循环体内 可能要重复百次甚至千次以上才能找到这个对
  • 毕业设计-基于深度学习的目标检测算法

    目录 前言 课题背景和意义 实现技术思路 一 两阶段深度学习算法 二 单阶段深度学习方法 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个
  • 华为OD机试 - 最大平分数组( Python)

    题目描述 给定一个数组nums 可以将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 最大的平分组个数 输入描述 第一行输入 m 接着输入m个数 表示此数组 数据范围 1 lt M lt 50 1 lt nums i lt 50
  • 使用C++的libcurl库实现HTTP的POST请求

    简介 libcurl库是由C语言编写的轻量级网络库 可以实现客户端的一些基本功能 本文使用libcurl库实现了HTTP的POST请求 代码 C 代码 使用POST方式完成对以下两个API的访问 localhost 8050 api dat
  • .NET框架介绍

    NET平台 如图所示最上层VB C C JScript等为编程语言 这些语言的基础是最底层的操作系统以及com组件和services服务程序 net语言的核心由 公共语言进行时 CLR 和基础类库 Base Class Library 两部
  • 【超分辨率】(EDSR)Enhanced Deep Residual Networks for Single Image Super-Resolution论文阅读笔记

    论文名称 Enhanced Deep Residual Networks for Single Image Super Resolution 论文下载地址 https arxiv org pdf 1707 02921 pdf 论文代码地址
  • 7.6、LSM6DSL_SENSOR_HUB模式

    7 6 LSM6DSL SENSOR HUB模式 文章目录 7 6 LSM6DSL SENSOR HUB模式 7 6 1 简介 7 6 2 LSM6DSL SENSOR HUB模式 7 6 3 sensor hub直连模式 7 6 4 测试
  • Flutter框架和原理剖析

    Flutter是Google推出并开源的跨平台开发框架 主打跨平台 高保真 高性能 开发者可以通过Dart语言开发Flutter应用 一套代码同时运行在ios和Android平台 不仅如此 flutter还支持web 桌面 嵌入应用的开发
  • 四象限运行模式_sem四象限分析法

    四象限分析法是SEM中一个常用方法 我们把账户内的关键词按照横坐标X 消费 纵坐标Y 转化 若无转化数据 替换为转化率 点击率均适用 按照以下四个象限进行分类 第一象限 高消费高转化 可能存在问题 账户设置待优化 主要 网站访问率 转化率低
  • 条件竞争漏洞Double Fetch

    前言 Double Fetch 双取 是一种条件竞争的漏洞 相关的论文发表在USENIX 论文链接 https www usenix org system files conference usenixsecurity17 sec17 wa
  • Qt基本控件及三大布局

    Qt基本模块 一 Qt的三大布局 QHBoxLayout 水平显示布局 所有在其上面摆放的控件只能水平排列下去 QVBoxLayout 垂直显示布局 所有在其上面摆放的控件只能垂直排列下去 QGridLayout 格子显示布局 可以按照表格