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一次,怪不得会执行两次槽函数。那注释掉构造中手动关联的信号,槽,问题就解决了。