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

举报
鱼酱 发表于 2022/01/07 22:04:41 2022/01/07
【摘要】 文章目录 1.参数介绍2.简单使用3.函数重载时的使用4.信号连接信号5.信号断开6.信号槽宏函数7.信号参数可以多于槽参数 1.参数介绍 QMetaObject::Connection ...

1.参数介绍

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


  
 
  • 1
  • 2
  • 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);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • Qt4的写法
  QLabel *label = new QLabel;
  QScrollBar *scrollBar = new QScrollBar;
  QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                   label,  SLOT(setNum(int)));

  
 
  • 1
  • 2
  • 3
  • 4
  • 差异
    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);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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()));
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

5.信号断开

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

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

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

  
 
  • 1
  • 2
  • 3

注意:

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

6.信号槽宏函数

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

  
 
  • 1
  • 2

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

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

  
 
  • 1
  • 2
  • 3
  • 4

文章来源: yujiang.blog.csdn.net,作者:鱼酱2333,版权归原作者所有,如需转载,请联系作者。

原文链接:yujiang.blog.csdn.net/article/details/105025961

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。