没有合适的资源?快使用搜索试试~ 我知道了~
首页豆子修订版:Qt学习之路2(含书签与Qt4/5并重)
豆子修订版:Qt学习之路2(含书签与Qt4/5并重)
5星 · 超过95%的资源 需积分: 9 16 下载量 35 浏览量
更新于2024-07-18
1
收藏 3.31MB PDF 举报
"《QT学习之路2(带书签)》是作者豆子针对Qt编程语言的一系列深度教程。原作曾基于《C++GUI Programming with Qt4, 2nd Edition》,但随着Qt技术的快速发展,特别是Qt5的临近,豆子决定重新修订该系列,以适应新的版本和技术变化。修订的核心原则保持原有的结构框架,即从基础知识介绍、常用GUI组件讲解、常用技术应用等方面,同时融入Qt4与Qt5的内容对比和共通之处。 豆子在修订过程中弥补了上一版本的不足,尤其是对Qt的XML、数据库和网络等高级特性进行了详细介绍,因为他现在对Qt有了更深入的理解。虽然目标定位于入门教程,豆子也希望能加入一些关于Qt实现层面的内容,如信号槽的实现,但这部分可能会有一定的技术难度和深度,需要读者投入额外的时间和精力。 此次修订不再局限于《C++GUI Programming with Qt4》的内容,而是关注Qt技术的演进,以帮助读者更好地理解和掌握Qt5的发展趋势。由于Qt5的发布可能会影响Qt4的长期地位,豆子选择以《QT学习之路2》或2.0版本的形式呈现,以兼顾两个版本的学习。 这个系列对于初次接触Qt或希望深入了解Qt的新手来说是一份宝贵的资源,同时也为有一定经验的开发者提供了更新的知识点和案例分析,有助于他们在Qt世界中稳步前行。"
资源详情
资源推荐
型是
const QObject *
,
signal
的类型是
const char *
,
receiver
类型是
const QObject *
,
slot
类型是
const char *
。这个函数将
signal
和
slot
作为字符串处理。第二个,
sender
和
receiver
同样是
const QObject *
,但是
signal
和
slot
都是
const QMetaMethod
&
。我 们 可以将 每个 函 数看 做 是
QMetaMethod
的子 类 。因此 ,这 种 写法 可 以使 用
QMetaMethod
进行类型比对。第三个,
sender
同样是
const QObject *
,
signal
和
slot
同样是
const char *
,但是却缺少了
receiver
。这个函数其实是将
this
指针作为
receiver
。
第四个,
sender
和
receiver
也都存在,都是
const QObject *
,但是
signal
和
slot
类
型则是
PointerToMemberFunction
。看这个名字就应该知道,这是指向成员函数的指针。
第五个,前面两个参数没有什么不同,最后一个参数是
Functor
类型。这个类型可以接受
static
函数、全局函数以及
Lambda
表达式。
由此我们可以看出,
connect()
函数,
sender
和
receiver
没有什么区别,都是
QObject
指针;主要是
signal
和
slot
形式的区别。具体到我们的示例,我们的
connect()
函数显
然是使用的第五个重载,最后一个参数是
QApplication
的
static
函数
quit()
。也就是说,
当我们的
button
发出了
clicked()
信号时,会调用
QApplication
的
quit()
函数,使程序退
出。
信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。如果不一致,允许的情况是,
槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前
面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的
参数比信号的少),但是不能说信号根本没有这个数据,你就要在槽函数中使用(就是槽函
数的参数比信号的多,这是不允许的)。
如果信号槽不符合,或者根本找不到这个信号或者槽函数的话,比如我们改成:
1
QObject::connect(&button, &QPushButton::clicked, &QApplication::quit2);
由于
QApplication
没有
quit2
这样的函数的,因此在编译时,会有编译错误:
1
'quit2' is not a member of QApplication
这样,使用成员函数指针,我们就不会担心在编写信号槽的时候会出现函数错误。
借助
Qt 5
的信号槽语法,我们可以将一个对象的信号连接到
Lambda
表达式,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// !!! Qt 5
#include <QApplication>
#include <QPushButton>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("Quit");
QObject::connect(&button, &QPushButton::clicked, [](bool) {
qDebug() << "You clicked me!";
});
button.show();
return app.exec();
}
注意这里的
Lambda
表达式接收一个
bool
参数,这是因为
QPushButton
的
clicked()
信号实际上是有一个参数的。
Lambda
表达式中的
qDebug()
类似于
cout
,将后面的字符
串打印到标准输出。如果要编译上面的代码,你需要在
pro
文件中添加这么一句:
1
QMAKE_CXXFLAGS += -std=c++0x
然后正常编译即可。
Qt 4
的信号槽同
Qt 5
类似。在
Qt 4
的
QObject
中,有三个不同的
connect()
重载:
C++
1
2
3
4
5
6
7
8
bool connect(const QObject *, const char *,
const QObject *, const char *,
Qt::ConnectionType);
bool connect(const QObject *, const QMetaMethod &,
const QObject *, const QMetaMethod &,
Qt::ConnectionType);
9
10
11
bool connect(const QObject *, const char *,
const char *,
Qt::ConnectionType) const
除了返回值,
Qt 4
的
connect()
函数与
Qt 5
最大的区别在于,
Qt 4
的
signal
和
slot
只
有
const char *
这么一种形式。如果我们将上面的代码修改为
Qt 4
的,则应该是这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// !!! Qt 4
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("Quit");
QObject::connect(&button, SIGNAL(clicked()),
&app, SLOT(quit()));
button.show();
return app.exec();
}
我们使用了
SIGNAL
和
SLOT
这两个宏,将两个函数名转换成了字符串。注意,即使
quit()
是
QApplication
的
static
函数,也必须传入一个对象指针。这也是
Qt 4
的信号槽语法
的局限之处。另外,注意到
connect()
函数的
signal
和
slot
都是接受字符串,因此,不
能将全局函数或者
Lambda
表达式传入
connect()
。一旦出现连接不成功的情况,
Qt 4
是
没有编译错误的(因为一切都是字符串,编译期是不检查字符串是否匹配),而是在运行时
给出错误。这无疑会增加程序的不稳定性。
信号槽机制是
Qt
的最大特性之一。这次我们只是初略了解了信号槽,知道了如何使用
connect()
函数进行信号槽的连接。在后面的内容中,我们将进一步介绍信号槽,了解如何
设计自己的信号槽等等。
首页
/ Qt
学习之路
2 / Qt
学习之路
2
(
5
):自定义信号槽
Qt 学习之路 2(5):自定义信号槽
豆子
2012
年
08
月
24
日
Qt
学习之路
2 53
条评论
上一节我们详细分析了
connect()
函数。使用
connect()
可以让我们连接系统提供的信号和
槽。但是,
Qt
的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自
己的信号和槽。这也是
Qt
框架的设计思路之一,用于我们设计解耦的程序。本节将讲解
如何在自己的程序中自定义信号槽。
信号槽不是
GUI
模块提供的,而是
Qt
核心特性之一。因此,我们可以在普通的控制台程
序使用信号槽。
经典 的观 察者模式 在讲 解举 例的时 候通 常会 举报 纸和 订阅 者的例子。有 一个 报纸类
Newspaper,有一个订阅者类 Subscriber。Subscriber 可以订阅 Newspaper。这样,当
Newspaper 有了新的内容的时候,Subscriber 可以立即得到通知。在这个例子中,观察者
是 Subscriber,被观察者是 Newspaper。在经典的实现代码中,观察者会将自身注册到被
观察者的一个容器中(比如 subscriber.registerTo(newspaper))。被观察者发生了任何变
化 的 时 候 , 会 主 动 遍 历 这 个 容 器 , 依 次 通 知 各 个 观 察 者
(
newspaper.notifyAllSubscribers()
)。
下面我们看看使用
Qt
的信号槽,如何实现上述观察者模式。注意,这里我们仅仅是使用
这个案例,我们的代码并不是去实现一个经典的观察者模式。也就是说,我们使用
Qt
的
信号槽机制来获得同样的效果。
1
2
3
4
5
//!!! Qt5
#include <QObject>
////////// newspaper.h
class Newspaper : public QObject
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{
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[])
{
剩余390页未读,继续阅读
jamin_liu_91
- 粉丝: 43
- 资源: 44
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 新型矿用本安直流稳压电源设计:双重保护电路
- 煤矿掘进工作面安全因素研究:结构方程模型
- 利用同位素位移探测原子内部新型力
- 钻锚机钻臂动力学仿真分析与优化
- 钻孔成像技术在巷道松动圈检测与支护设计中的应用
- 极化与非极化ep碰撞中J/ψ的Sivers与cos2φ效应:理论分析与COMPASS验证
- 新疆矿区1200m深孔钻探关键技术与实践
- 建筑行业事故预防:综合动态事故致因理论的应用
- 北斗卫星监测系统在电网塔形实时监控中的应用
- 煤层气羽状水平井数值模拟:交替隐式算法的应用
- 开放字符串T对偶与双空间坐标变换
- 煤矿瓦斯抽采半径测定新方法——瓦斯储量法
- 大倾角大采高工作面设备稳定与安全控制关键技术
- 超标违规背景下的热波动影响分析
- 中国煤矿选煤设计进展与挑战:历史、现状与未来发展
- 反演技术与RBF神经网络在移动机器人控制中的应用
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功