QT5 信号槽
2016-08-16 14:01
253 查看
信号槽是 Qt 框架引以为豪的机制之一。为了体验一下信号槽的使用,我们以一段简单的代码说明:
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("&Quit");
QObject::connect(&button,&QPushButton::clicked,&QApplication::quit);
button.show();
return app.exec();
}
注意:我们的代码是以 Qt 5 为主线,这意味着,有的代码放在 Qt 4 上是不能编译的
在 Qt 5 中,QObject::connect() 有五个重载:
QMetaObject::Connection connect(const QObject *, const char *, const QObject *, const char *, Qt::ConnectionType);
这是我们最常用的形式。connect() 一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用
receiver 的 slot 函数。
第一个,sender 类型是 const QObject *,signal 的类型是 const char *,receiver 类型是 const QObject *,slot 类型是 const char *。这个函数将 signal 和 slot 作为字符串处理。
QMetaObject::Connection connect(const QObject *, const QMetaMethod &, const QObject *, const QMetaMethod &, Qt::ConnectionType);
第二个,sender
和 receiver 同样是 const QObject *,但是 signal 和 slot 都是 const
QMetaMethod &。我们可以将每个函数看做是 QMetaMethod 的子类。因此,这种写法可以使用 QMetaMethod 进行类型比对。
QMetaObject::Connection connect(const QObject *, const char *, const char *, Qt::ConnectionType) const;
第三个,sender
同样是 const QObject *,signal 和 slot 同样是 const
char *,但是却缺少了 receiver。这个函数其实是将 this 指针作为 receiver。
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction, const QObject *, PointerToMemberFunction, Qt::ConnectionType);
第四个,sender
和 receiver 也都存在,都是 const QObject *,但是 signal 和 slot 类型则是 PointerToMemberFunction。看这个名字就应该知道,这是指向成员函数的指针。
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction, Functor);
第五个,前面两个参数没有什么不同,最后一个参数是 Functor 类型。这个类型可以接受
static 函数、全局函数以及 Lambda 表达式。
将信号与槽连接起来时,QObject::connect()的最后一个参数将指定连接类型:
o Qt::DirectConnection:直接连接意味着槽函数将在信号发出的线程直接调用
o Qt::QueuedConnection:队列连接意味着向接受者所在线程发送一个事件,该线程的事件循环将获得这个事件,然后之后的某个时刻调用槽函数
o Qt::BlockingQueuedConnection:阻塞的队列连接就像队列连接,但是发送者线程将会阻塞,直到接受者所在线程的事件循环获得这个事件,槽函数被调用之后,函数才会返回
o Qt::AutoConnection:自动连接(默认)意味着如果接受者所在线程就是当前线程,则使用直接连接;否则将使用队列连接
我们使用 Qt 的信号槽机制
点击(此处)折叠或打开
#include <QObject>
////////// newspaper.h
class Newspaper : public QObject
{
Q_OBJECT
public:
Newspaper(const QString & name) :
m_name(name)
{
}
void send()
{
emit newPaper(m_name);
}
signals:
void newPaper(const QString &name);
private:
QString m_name;
};
////////// reader.h
#include <QObject>
#include <QDebug>
class Reader : public QObject
{
Q_OBJECT
public:
Reader() {}
void receiveNewspaper(const QString & name)
{
qDebug() << "Receives
Newspaper: " << name;
}
};
////////// main.cpp
#include <QCoreApplication>
#include "newspaper.h"
#include "reader.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Newspaper newspaper("Newspaper A");
Reader reader;
QObject::connect(&newspaper, &Newspaper::newPaper,
&reader, &Reader::receiveNewspaper);
newspaper.send();
return app.exec();
}
Qt 5 中,任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数。
网址:http://blog.chinaunix.net/uid-24219701-id-4042043.html
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("&Quit");
QObject::connect(&button,&QPushButton::clicked,&QApplication::quit);
button.show();
return app.exec();
}
注意:我们的代码是以 Qt 5 为主线,这意味着,有的代码放在 Qt 4 上是不能编译的
在 Qt 5 中,QObject::connect() 有五个重载:
QMetaObject::Connection connect(const QObject *, const char *, const QObject *, const char *, Qt::ConnectionType);
这是我们最常用的形式。connect() 一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用
receiver 的 slot 函数。
第一个,sender 类型是 const QObject *,signal 的类型是 const char *,receiver 类型是 const QObject *,slot 类型是 const char *。这个函数将 signal 和 slot 作为字符串处理。
QMetaObject::Connection connect(const QObject *, const QMetaMethod &, const QObject *, const QMetaMethod &, Qt::ConnectionType);
第二个,sender
和 receiver 同样是 const QObject *,但是 signal 和 slot 都是 const
QMetaMethod &。我们可以将每个函数看做是 QMetaMethod 的子类。因此,这种写法可以使用 QMetaMethod 进行类型比对。
QMetaObject::Connection connect(const QObject *, const char *, const char *, Qt::ConnectionType) const;
第三个,sender
同样是 const QObject *,signal 和 slot 同样是 const
char *,但是却缺少了 receiver。这个函数其实是将 this 指针作为 receiver。
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction, const QObject *, PointerToMemberFunction, Qt::ConnectionType);
第四个,sender
和 receiver 也都存在,都是 const QObject *,但是 signal 和 slot 类型则是 PointerToMemberFunction。看这个名字就应该知道,这是指向成员函数的指针。
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction, Functor);
第五个,前面两个参数没有什么不同,最后一个参数是 Functor 类型。这个类型可以接受
static 函数、全局函数以及 Lambda 表达式。
将信号与槽连接起来时,QObject::connect()的最后一个参数将指定连接类型:
o Qt::DirectConnection:直接连接意味着槽函数将在信号发出的线程直接调用
o Qt::QueuedConnection:队列连接意味着向接受者所在线程发送一个事件,该线程的事件循环将获得这个事件,然后之后的某个时刻调用槽函数
o Qt::BlockingQueuedConnection:阻塞的队列连接就像队列连接,但是发送者线程将会阻塞,直到接受者所在线程的事件循环获得这个事件,槽函数被调用之后,函数才会返回
o Qt::AutoConnection:自动连接(默认)意味着如果接受者所在线程就是当前线程,则使用直接连接;否则将使用队列连接
我们使用 Qt 的信号槽机制
点击(此处)折叠或打开
#include <QObject>
////////// newspaper.h
class Newspaper : public QObject
{
Q_OBJECT
public:
Newspaper(const QString & name) :
m_name(name)
{
}
void send()
{
emit newPaper(m_name);
}
signals:
void newPaper(const QString &name);
private:
QString m_name;
};
////////// reader.h
#include <QObject>
#include <QDebug>
class Reader : public QObject
{
Q_OBJECT
public:
Reader() {}
void receiveNewspaper(const QString & name)
{
qDebug() << "Receives
Newspaper: " << name;
}
};
////////// main.cpp
#include <QCoreApplication>
#include "newspaper.h"
#include "reader.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Newspaper newspaper("Newspaper A");
Reader reader;
QObject::connect(&newspaper, &Newspaper::newPaper,
&reader, &Reader::receiveNewspaper);
newspaper.send();
return app.exec();
}
Qt 5 中,任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数。
网址:http://blog.chinaunix.net/uid-24219701-id-4042043.html
相关文章推荐
- Qt connect parent widget 连接父控件的信号槽
- 在QT的信号和槽中使用自定义类型
- Qt:信号与槽的连接函数问题
- Qt编程之信号与槽-------unresolved external symbol "public: virtual struct QMetaObject const * __thiscall XX::metaObject(void)const
- qt线程间信号与槽
- Qt-信号和槽中使用自定义数据类型
- qt4 消息映射--信号 槽
- Lambda表达式以及在QT5信号槽函数connect中的应用
- Qt学习总结(C鱼)之信号与槽01
- Qt5利用函数指针来区分信号
- 关于 qt 信号与槽 数组传递
- QT的信号/槽机制
- QT 的信号与槽机制介绍
- QT的信号与槽机制介绍(1)
- Qt 信号-槽 事件机制(汇总)
- QT中的信号和槽通讯机制
- PyQt5学习笔记06----Qt Designer自定义信号emit及传参
- Qt入门之信号与槽机制
- Qt多线程间信号槽传递非QObject类型对象的参数
- PyQt5学习笔记05----Qt Designer信号槽