美文网首页
2.图形界面、对话框、信号与槽

2.图形界面、对话框、信号与槽

作者: _u9ece | 来源:发表于2018-10-26 22:58 被阅读0次

    一、QT图形界面

    • QT坐标轴:
      X:横轴
      Y:纵轴


      image.png
    • QWidget、QDialog、QMainWindow的区别
      QWidget:窗口为空,什么内容都没有
      QMainWindow:含有menu bar,status bar,tools bar等
      QDialog:对话框

    • 设置编码方式linux除外

      编码.png
    • QMainWinodw

    菜单栏--Menu Bar
    工具栏--ToolBars
    浮动部件--Duck Widgets
    主窗口--Central Widget
    状态栏--Status Bar

    布局 image.png

    注意:窗口设计的代码需要放在构造函数中ui->setupUi(this);代码后面,不然会挂掉。

    TODO.png
    Not TODO.png

    二、对话框

    • 分类:模态对话框,非模态对话框,半模态对话框
     //Moldal Dialog
        QDialog * Qdlg=new QDialog(&w);//w:parent window
        Qdlg->resize(200,300);
        Qdlg->setWindowTitle(QStringLiteral("Modal Dialog"));
        Qdlg->exec();
    
     //Modeless Dialog
        QDialog * Qdlg=new QDialog(&w);//w:parent window
        Qdlg->resize(200,300);
        Qdlg->setWindowTitle(QStringLiteral("Modeless Dialog"));
        Qdlg->show();
    
     //setModal(true/false)实现模态和非模态的转化
        Qdlg->setModal(false);
        Qdlg->show();
    

    三、信号与槽

    概念:在Qt中使用信号和槽机制来完成对象之间的协同操作(信号和槽都是函数)

    信号:当某个信号对其客户或所有者发生的内部状态发生改动,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。

    当一个信号被发射时,和其相关联的槽将被即时执行,就象一个正常的函数调用相同。信号-槽机制完全独立于所有GUI事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽和某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,不过他们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行

    :槽是普通的C++成员函数,能被正常调用,他们唯一的特别性就是非常多信号能和其相关联。当和其关联的信号被发射时,这个槽就会被调用。槽能有参数,但槽的参数不能有缺省值。

    public slots:在这个区内声明的槽意味着所有对象都可将信号和之相连接。这对于组件编程非常有用,你能创建彼此互不了解的对象,将他们的信号和槽进行连接以便信息能够正确的传递。
    protected slots:在这个区内声明的槽意味着当前类及其子类能将信号和之相连接。这适用于那些槽,他们是类实现的一部分,不过其界面接口却面向外部。
    private slots:在这个区内声明的槽意味着只有类自己能将信号和之相连接。这适用于联系非常紧密的类。
    槽也能够声明为虚函数,这也是非常有用的。

    关联:通过调用QObject对象的connect函数来将某个对象的信号和另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用

    *函数定义:bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) [static]

    1.自动关联

    image.png
    • 按需要选择要生成的槽函数:


      image.png
    • 系统自动生成槽函数,一般以on为开头
    //此次自动生成的槽函数
    private slots:
        void on_pushButton_clicked();//Qt-defined slot
    
    //槽函数用户自己实现函数体
    void MainWindow::on_pushButton_clicked(){}
    

    2.利用connect()关联

    注意:信号函数与槽函数的参数必须一致,且都是自定义函数。
    信号函数:只需要定义,不需要实现,没有实体。
    槽函数:响应函数,需要实现功能。

    //parameter : sender signal receiver slot
    connect()
    
    • 系统信号和用户定义槽
    //ui头文件里
    signals:
        void pushButton2Signal();//user-defined signal
    private slots:
        void pushButton2Slot(bool checked);//usr-defined slot
    
    //在ui构造函数中实现connect关联
    //parameter : sender signal receiver slot
    connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(pushButton2Slot(bool)));
    
    • 用户信号和槽
    //ui头文件
    signals:
        void pushButton2Signal();//user-defined signal
    private slots:
        void pushButtonMySlot();//user-defined slot
    
    //在某函数体内发射信号
    emit pushButton2Signal();//emit user-defined signal
    
    ////在ui构造函数中实现connect关联
    connect(this,SIGNAL(pushButton2Signal()),this,SLOT(pushButtonMySlot()));
    

    3.断开关联

    当信号和槽没有必要继续保持关联时,我们能使用disconnect函数来断开连接
    函数定义:bool QObject::disconnect ( const QObject * sender, const char * signal, const Object * receiver, const char * member ) [static]

    有三种情况必须使用disconnect()函数:
    (1):断开和某个对象相关联的所有对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或多个信号,这些信号和另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就能利用这个方法,非常之简洁。
    disconnect( myObject, 0, 0, 0 ) 或 myObject->disconnect()
    (2):断开和某个特定信号的所有关联。
    disconnect( myObject, SIGNAL(mySignal()), 0, 0 ) 或 myObject->disconnect( SIGNAL(mySignal()) )
    (3):断开两个对象之间的关联。
    disconnect( myObject, 0, myReceiver, 0 ) 或 myObject->disconnect( myReceiver )

    在disconnect函数中0能用作一个通配符,分别表示所有信号、所有接收对象、接收对象中的所有槽函数。不过发射者sender不能为0,其他三个参数的值能等于0

    相关文章

      网友评论

          本文标题:2.图形界面、对话框、信号与槽

          本文链接:https://www.haomeiwen.com/subject/cjdltqtx.html