zoukankan      html  css  js  c++  java
  • Qt5:理解信号和槽

    实现了查找对话框,现在就开始来分析主要代码   http://www.cnblogs.com/wowk/archive/2013/06/01/3112742.html

     1 class FindDialog : public QDialog
     2 {
     3     Q_OBJECT
     4 public:
     5     explicit FindDialog(QWidget *parent = 0);
     6     ~FindDialog();
     7 public slots:
     8     void    findBtnEnabled(const QString &txt);
     9     void    findClicked();
    10     void    stopClicked();
    11 public    slots:
    12     void    findPrevious_Slot(const QString&txt,Qt::CaseSensitivity cs);
    13     void    findNext_Slot(const QString&txt,Qt::CaseSensitivity cs);
    14 signals:
    15      void findNext(const QString &str , Qt::CaseSensitivity cs);
    16      void findPrevious(const QString &str , Qt::CaseSensitivity cs);
    17 public:
    18     ........................    
    19 };

    看如上的类定义代码:

      槽函数的 函数原型的 参数列表一定要和 信号函数的 参数列表相同

        槽函数定义的时候  可以定义  访问限定符可以是  public/protected/private  slots:

        而定义信号函数的时候    限定符 只能写成   signals:

       注:类定义的第一行一定要加上  O_OBJECT  这个宏

     1 //查找按钮点击槽函数
     2 void    FindDialog::findClicked()
     3 {
     4     QString    txt = text->text();
     5   //获取是否大小写匹配的状态
     6     Qt::CaseSensitivity    cs =
     7         caseSensCheck->isChecked()?Qt::CaseSensitive:
     8                        Qt::CaseInsensitive;
     9     if(prevCheck->isChecked())
    10         emit    findPrevious(txt,cs);//发射向前查找信号
    11     else
    12         emit    findNext(txt,cs);//发射向后查找信号
    13 }

    在上述代码中 

      emit   findPrevious(txt,cs);//发射向前查找信号

      emit   findNext(txt,cs);//发射向后查找信号

    其中  emit 是Qt中的关键字, 会被C++预处理器 处理成相应的 C++ 代码

    在发射一个信号的时候  ,  这个关键字是必需的 , 而且后面跟的函数调用 必须是 在类中声明了的  信号函数

    1  一个信号可以和多个槽相连接 

        当相应的信号发生的时候 ,  程序会以不确定的顺序 一个接一个的 调用  与其相连接的所有 槽函数

    2   一个槽也可以和多个信号相连接

        与该槽相连的任何信号发生的时候, 该槽函数都会被调用

    3  一个信号可以和另一个信号相连接

        通过 connect(A , SIGNAL(sig1()),B , SIGNAL( sig2() )); , 可以将一个信号与另一个信号进行连接 , 当一个信号发射的时候 , 另一个信号也会发射

    1     this->connect(this,
    2               SIGNAL(findNext(const QString&,Qt::CaseSensitivity)),
    3               this,
    4               SIGNAL(findPrevious(QString,Qt::CaseSensitivity)));

    4、信号与槽的连接  或者  信号与信号的连接  都可以移除

        移除 连接  , 只要调用  disconnect() 函数即可

    要把信号成功连接到槽(或者连接到另外一个信号) ,宦出雄也是有相同的顺序和相同
    的类型:
    connect(ftp , SIGNAL(rawCommandReply(int , const QString &)),
    this , SLOT(processReply(int , const QString &).));
    这里有个例外,如果信号的参数比它所连接的槽的参数多,那么多余的参数将会被直接忽略掉:

    另外 :  在链接信号和 槽函数的 时候 , 可以不用connect函数  ,而直接通过遵循一定的命名规则,来让编译器自动连接 信号和槽

     命名规则如下:

        void  on_对象名_signal名( 参数列表);

      例如:

    void    SortDialog::on_cancelBtn_clicked()
    {
        this->close();
    }

    此处的函数 就是与   cancelBtn 对象的 clicked() 信号相连接的 槽函数

  • 相关阅读:
    [buuctf] pwn-第五空间2019pwn
    [buuctf] pwn-[OGeek2019]babyrop
    [buuctf] pwn-ciscn_2019_c_1
    [buuctf] pwn-jarvisoj_level0
    wamp集成环境配置php7.x连接mssql
    EXCEL小技巧之单击单元格实现自增
    Asuhe博客转移
    数据链路层中的最小帧长是如何计算出来的?
    CSMA/CD协议中如何确定数据重传时机?
    Cache设计
  • 原文地址:https://www.cnblogs.com/wowk/p/3112780.html
Copyright © 2011-2022 走看看