VS2019与Qt5.14.2联合编程下,信号与槽的实现

1.联合编程下,信号和槽的实现
在vs环境下,我们创建一个默认的工程,通过QtCreater打开.ui文件,我们发现没有转到槽选项。
在这里插入图片描述
那怎么办呢?三种方法
先说最麻烦的
1.1手动编辑信号与槽,不过这样最稳妥
请添加图片描述
点击编辑信号/槽
请添加图片描述选中按键信号,编辑槽函数,然后点ok确定
你会发现在.ui的头文件中信号和槽已经关联起来了
(ui_QtServer.h文件中)

QObject::connect(pushButton, SIGNAL(clicked()), QtServerClass, SLOT(Pushbuttonclicked()));

然后在你定义的类的头文件分别声明和实现槽函数Pushbuttonclicked()就可以啦
QtSercer.h

private slots:
    void Pushbuttonclicked();

QtServer.cpp

void QtServer::Pushbuttonclicked()
{
    qDebug() << QString::fromLocal8Bit("04运行次数计");
}

按下按钮成功运行了
请添加图片描述
一顿操作猛如虎,是有点麻烦
1.2直接在自定义类(我的是QtServer类)的构造里面使用connect函数关联信号和槽
当然,槽函数的声明和定义依然是少不了的

头文件中声明
private slots:
    void on_clicked();
源文件中实现
void QtServer::on_clicked()
{
    qDebug() << QString::fromLocal8Bit("03运行次数计");
}
源文件的类的构造中关联信号与槽
QtServer::QtServer(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    connect(ui.test03, &QPushButton::clicked, this, &QtServer::on_clicked);
    ....
    ....
 }	

请添加图片描述
运行成功!
1.3Qt自己自动关联信号和槽
偶然的发现,我只按1.2的方法定义一个槽函数,不知为何,会运行我们的槽函数两遍
就是下面的这个样子
请添加图片描述
?????
怎么同一个槽函数进两次断点
在这里插入图片描述
正当我百思不得其解时,看到这篇博客:https://blog.csdn.net/weixin_50016546/article/details/129783631
原来只要命名符合槽函数的规范,Qt将自动关联信号和槽。
具体在ui的头文件中,

  void setupUi(QMainWindow *QtServerClass){
  ...
  ...
          QMetaObject::connectSlotsByName(QtServerClass);
  }

这句 QMetaObject::connectSlotsByName(QtServerClass);就是自动关联信号和槽的关键了。
去助手里面搜了一下这个函数的文档
在这里插入图片描述
这个connectSlotsByName函数什么意思呢,简单来说,就是你定义的按键,他会自己匹配合适的槽函数,隐式的帮你做了connect操作。文档还贴心的给了个例子,你定义了一个button1按键,
那么他将自动去找按键按下的函数void on_button1_clicked(),Qt自动去关联,这也太方便了吧,有了connectSlotsByName,小蝌蚪再也不用担心找不到妈妈了!
具体的命名规范文档也给出来了

  void on_<object name>_<signal name>(<signal parameters>);

拿上面的button1来说
object_name = button1
signal_name = cliked
没有signal_parameters,所以为空
连起来就是

void on_button1_clicked();

回到原来,构造中手动connect一个信号槽,为什么会执行两次就明白了。原来是我命名的槽函数正好符合命名规范,相当于我显式的connect一次,又隐式的connect一次,怪不得会执行两次槽函数。那注释掉构造中手动关联的信号,槽,问题就解决了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值