Qt每天一例17.信号槽的一些写法技巧

Posted 鱼酱2333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt每天一例17.信号槽的一些写法技巧相关的知识,希望对你有一定的参考价值。

1.参数介绍

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

  • sender 发送者
  • signal 信号
  • receiver 接受者
  • method 函数
  • type 连接方式

2.简单使用

  • Qt5的写法
    connect(a,&QPushButton::clicked,this,&MainWindow::dealTest1);
    void(MainWindow:: *dealtestex)(int) = &MainWindow::dealTest2;
    void(MainWindow:: *dealtest2)() = &MainWindow::dealTest2;
    connect(a,&QPushButton::clicked,this,dealtestex);
    connect(a,&QPushButton::clicked,this,dealtest2);
  • Qt4的写法
  QLabel *label = new QLabel;
  QScrollBar *scrollBar = new QScrollBar;
  QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                   label,  SLOT(setNum(int)));
  • 差异
    1.Qt的SIGNAL,和SLOT参数不会匹配,编译器不报错
    2.建议使用Qt5的写法

3.函数重载时的使用

    connect(a,&QPushButton::clicked,this,&MainWindow::dealTest1);
    void(MainWindow:: *dealtestex)(int) = &MainWindow::dealTest2;
    void(MainWindow:: *dealtest2)() = &MainWindow::dealTest2;
    connect(a,&QPushButton::clicked,this,dealtestex);
    connect(a,&QPushButton::clicked,this,dealtest2);

4.信号连接信号

//声明放到头文件里,不然报错
class MyWidget : public QWidget

 Q_OBJECT

public:
 MyWidget();

signals:
 void buttonClicked();

private:
 QPushButton *myButton;
;

MyWidget::MyWidget()

     myButton = new QPushButton(this);
     connect(myButton, SIGNAL(clicked()),
             this, SIGNAL(buttonClicked()));

5.信号断开

  • 断开与myObject对象的信号与其他对象间的连接,使用后myObject发出的信号没有对应的槽函数进行响应
disconnect(myObject, 0, 0, 0);
// or
myObject->disconnect();
  • 断开与myObject对象的mySignal()信号与其他对象间的连接,使用后myObject发出mySignal()信号没有对应的槽函数进行响应
disconnect(myObject, SIGNAL(mySignal()), 0, 0);
// or
myObject->disconnect(SIGNAL(mySignal()));
  • 断开与myObject对象与myReceiver对象间的连接,使用后myObject发出mySignal()信号myReceiver对应的槽函数进行响应
disconnect(myObject, 0, myReceiver, 0);
// or
myObject->disconnect(myReceiver);

注意:

  • 0表示任意的信号或者接收者对象
  • const QObject * sender不能是0

6.信号槽宏函数

  QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                   label,  SLOT(setNum(int)));

7.信号参数可以多于槽参数

    QPushButton *a = new QPushButton;
    a->setParent(this);
    void(MainWindow:: *dealtestex)(int) = &MainWindow::dealTest2;
     connect(a,&QPushButton::clicked,this,dealtest2);

以上是关于Qt每天一例17.信号槽的一些写法技巧的主要内容,如果未能解决你的问题,请参考以下文章

Qt每天一例5.打印Qt版本

Qt每天一例3.创建一个线程

Qt每天一例7.输出当前程序GID

Qt每天一例13.枚举转字符串

Qt每天一例12.保留两位有效数字

Qt每天一例15.QMap添加操作