信号槽
connect函数用来关联信号函数和槽函数
调用信号函数时会往信号队列中加入一条记录
同时信号处理线程会查询信号队列是否有值,一旦有值,就会调用信号和槽关联队列
信号和槽关联队列中存着信号和槽相对应的数据结构
信号处理线程找到信号相对应的槽函数,然后调用
Qt设计师设置信号槽
菜单栏下方的图标栏中选编辑信号/槽,双击按住发送信号的控件将红线拉到接收信号的控件,在弹出的配置连接中选择相应的信号函数和槽函数
在右下方的信号/槽编辑器(没有的话在菜单栏视图中勾选)中设置
自定义信号槽
为什么要自定义信号槽
(1)内置槽函数不能满足我们的全部需求
(2)Qt不允许其他线程调用主线程槽函数,但允许调用信号函数,因此我们需要自定义信号函数去绑定槽函数,实现间接调用槽函数
自定义信号槽
(1)添加宏Q_OBJECT,moc通过该宏判断是否生成信号槽相应cpp代码(如果在生成信息中没有moc的过程,可能是没有添加该宏或者是该宏前后存在空格)
(2)通过关键字signals、slots定义信号槽
(3)通过connect(发出对象, SIGNAL(信号函数), 接收对象, SLOT(槽函数))函数绑定(disconnect解绑)
QThread
创建线程类接口继承QThread
重载run(),处理线程函数
线程对象调用start(),启动线程函数
Example:自定义信号函数
XWidget.h
#pragma once
#include <QWidget>
class XWidget : public QWidget
{
Q_OBJECT
public:
XWidget();
virtual ~XWidget();
signals:
void Hide();
};
XWidget.cpp
#include "XWidget.h"
XWidget::XWidget()
{
QObject::connect(this, SIGNAL(Hide()), this, SLOT(hide()));
}
XWidget::~XWidget()
{
}
main.cpp
#include "XWidget.h"
#include <QtWidgets/QApplication>
#include <QThread>
static XWidget *w = NULL;
class XThread : public QThread
{
public:
void run()
{
msleep(3000);
w->Hide();
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
w = new XWidget();
w->show();
w->setWindowTitle("testWidget");
XThread xt;
xt.start();
return a.exec();
}