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() 信号相连接的 槽函数

原文地址:https://www.cnblogs.com/wowk/p/3112780.html