一 前言:
上篇文章中对Qt的信号槽进制作了简要介绍并对比了Qt5与Qt4中的差异,下面将通过实际代码举例说明信号槽的使用,谢谢支持。
二 代码:
为了代码简介(少写代码~),笔者使用UI界面,如下:
下面是代码:
// widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
signals:
//! 自定义信号
void testSignal();
private slots:
//! 自定义槽
void setTextSlot();
void testSlot();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QApplication>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//! 信号槽
connect(ui->pushButton_Test, &QPushButton::clicked, this, &Widget::setTextSlot);
connect(ui->pushButton_Quit, &QPushButton::clicked, &QApplication::quit);
//! 关联自定义信号
connect(this, &Widget::testSignal, &Widget::testSlot);
}
Widget::~Widget()
{
delete ui;
}
void Widget::setTextSlot()
{
ui->label_show->setText(tr("Hei, 测试成功!"));
//! 发出自定义信号
emit testSignal();
}
void Widget::testSlot()
{
QMessageBox::warning(NULL, tr("测试"),tr("自定义信号测试成功!"));
}
// main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
以上代码中的connect()是使用了Qt5中新添加的实现的,个人感觉这样的使用比较符合逻辑,最重要的是增加了编译期间的错误检查。
下面是Qt4下的实现:
//! 信号槽
connect(ui->pushButton_Test, SIGNAL(clicked(bool)), this, SLOT(setTextSlot()));
//connect(ui->pushButton_Quit, SIGNAL(clicked(bool)), SLOT(QApplication::quit)); // 无能为力啊
//! 关联自定义信号
connect(this, SIGNAL(testSignal()), SLOT(testSlot()));
由于Qt4中将信号和槽转换为char*作为的参数,无法将全局函数或者 Lambda 表达式传入connect()函数。
信号,分为Qt预定义信号和用户自定义信号,针对预定义信号,只需直接和槽连接即可使用,自定义信号必须由用户使用emit 关键字(本质为宏定义)手动发送。自定义的信号无需用户对其进行实现,Qt内部在Moc阶段会进行标准化处理。
槽,也分为预定义槽和自定义,使用起来没啥区别,需注意,自定义的槽函数需要实现,其参数为信号函数的入参,会自动传递给槽函数。
三 运行结果:
本次示例中的举例比较简单,仅供参考。