一、自定义信号,信号emit
1、自定义信号
在头文件中 加入signals: 就可以编写信号
2、emit
emit的作用是通知信号发生
二、跨UI控件传参
每次按Dialog添加按钮主控件数字会增长
cpp
// .h
private slots:
void on_btnAdd_clicked();
signals:
void sign_add(int value);
-----------------------------------------------
//.cpp
void setDialog::on_btnAdd_clicked()
{
static int num = 1;
emit sign_add(num++);
}
cpp
//.h
private slots:
void on_btnOpen_clicked();
void addnum(int value);
------------------------------------------------
//.cpp
void Widget::on_btnOpen_clicked()
{
setDialog d;
connect(&d,&setDialog::sign_add,this,&Widget::addnum);
d.exec();
}
void Widget::addnum(int value)
{
qDebug()<<value;
ui->lineEdit->setText(QString::number(value));
}
三、跨线程之间传参修改控件
子线程自动后台添加数字
cpp
//.h
#include <QThread>
class XThread : public QThread
{
Q_OBJECT
public:
XThread();
signals:
void sign_send(int value);
private:
void run() override;//重载 QThread 多线程基类 源码中run为虚函数
};
------------------------------------------------------------------
//.cpp
void XThread::run()
{
static int num = 0;
while(true)
{
emit XThread::sign_send(num++);
XThread::msleep(200);
}
}
cpp
//.cpp
void Widget::on_btnOpen_clicked()
{
XThread *th = new XThread();
connect(th,&XThread::sign_send,this,&Widget::addnum);
th->start();
}
四、槽函数的参数和信号参数的关系
Qt槽函数的参数需要和信号函数保持一致,可以比信号函数的参数少,但是不能顺序不同,也不能比信号函数的参数多。
五、解决信号重载问题
1、Qt4写法
cpp
connect(th,SIGNAL(sign_send(int)),this,SLOT(addnum(int)));
2、泛型写法
cpp
connect(th,QOverload<int>::of(&XThread::sign_send),this,&Widget::addnum);
六、Qt信号槽与moc
moc全称是 Meta-0bject Compiler,也就是"元对象编译器"。Qt程序在交由标准编译器编译之前,先要使用moc分析C++源文件。如果它发现在一个头文件中包含了宏Q_OBJECT,则会生成另外一个C++源文件,这个源文件中包含了Q_OBJECT宏的实现代码,这个新的文件名字将会是原文件名前面加上moc构成,这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是"替换"掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc的执行是在预理器之前。因为预处理器执行之后,Q_OBJECT宏就不存在了。
通俗来讲,就是moc把Qt中的一些不是C++的关键字做了解析,让C++的编译器在编译的过程中认识Qt中的关键字。
配置好环境后 ,在终端运行moc指令
生成的C++文件会在C++编译过程中链接到二进制文件中