qt学习 逃离我推掉我的手 2022-08-07 12:58 98阅读 0赞 摘自: http://www.devbean.net/2012/08/qt-study-road-2-catelog/ --------------------------------------- 输出 hello, world! --------------------------------------- #include <QtWidgets/QApplication> #include <qlabel.h> int main(int argc, char *argv[]) { QApplication a(argc, argv); QLabel label("hello, world!"); label.show(); return a.exec(); } -------------------------------------- 信号槽 -------------------------------------- // !!! Qt 5 #include <QApplication> #include <QPushButton> 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 中被称为`QPushButton`。 在 Qt 5 中,`QObject::connect()`有五个重载: QMetaObject::Connection connect(const QObject *, const char *, const QObject *, const char *, Qt::ConnectionType); // 第一个,sender 类型是<code>const QObject *</code>,signal 的类型是<code>const char *</code>, // receiver 类型是<code>const QObject *</code>,slot 类型是<code>const char *</code>。 // 这个函数将 signal 和 slot 作为字符串处理。 QMetaObject::Connection connect(const QObject *, const QMetaMethod &, const QObject *, const QMetaMethod &, Qt::ConnectionType); // 第二个,sender 和 receiver 同样是<code>const QObject *</code>,但是 signal 和 slot 都是<code>const QMetaMethod &</code>。 // 我们可以将每个函数看做是<code>QMetaMethod</code>的子类。因此,这种写法可以使用<code>QMetaMethod</code>进行类型比对。 QMetaObject::Connection connect(const QObject *, const char *, const char *, Qt::ConnectionType) const; // 第三个,sender 同样是<code>const QObject *</code>,signal 和 slot 同样是<code>const char *</code>, // 但是却缺少了 receiver。这个函数其实是将 this 指针作为 receiver。 QMetaObject::Connection connect(const QObject *, PointerToMemberFunction, const QObject *, PointerToMemberFunction, Qt::ConnectionType) // 第四个,sender 和 receiver 也都存在,都是<code>const QObject *</code>, // 但是 signal 和 slot 类型则是<code>PointerToMemberFunction</code>。 // 看这个名字就应该知道,这是指向成员函数的指针。 QMetaObject::Connection connect(const QObject *, PointerToMemberFunction, Functor); // 第五个,前面两个参数没有什么不同,最后一个参数是<code>Functor</code>类型。 // 这个类型可以接受 static 函数、全局函数以及 Lambda 表达式。 这五个重载的返回值都是 `QMetaObject::Connection`,现在我们不去关心这个返回值。下面我们先来看看 `connect()`函数最常用的一般形式: connect(sender, signal, receiver, slot); 这是我们最常用的形式。 `connect()`一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用 receiver 的 slot 函数。 由此我们可以看出,`connect()`函数,sender 和 receiver 没有什么区别,都是`QObject`指针;主要是 signal 和 slot 形式的区别。具体到我们的示例,我们的`connect()`函数显然是使用的第五个重载,最后一个参数是`QApplication`的 static 函数`quit()`。也就是说,当我们的 button 发出了`clicked()`信号时,会调用`QApplication`的`quit()`函数,使程序退出。 除了返回值,Qt 4 的`connect()`函数与 Qt 5 最大的区别在于,Qt 4 的 signal 和 slot 只有`const char *`这么一种形式。如果我们将上面的代码修改为 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:QHostAddress学习 QHostAddress > 功能: > > QHostAddress类提供了一个IP地址信息。这个类可以提供与平台无关的,支持IPv4和IPv6的IP地址信息。 谁践踏了优雅/ 2023年01月12日 11:40/ 0 赞/ 195 阅读
相关 【Qt】Qt学习笔记(更新中) 文章目录 0x00 前言 0x01 Qt简介 1.1 Qt是什么 1.2 Qt发展史 1.3 Qt支持的平台 今天药忘吃喽~/ 2022年12月21日 03:24/ 0 赞/ 188 阅读
相关 QT学习材料 1)QT学习之路.pdf(0积分下载) 这是一个高手的学习笔记,一共59节,几乎包括了所有Qt的基础知识。 他把这些个人体会放到网站上之后,有心人DZY将其整理成PDF格式 落日映苍穹つ/ 2022年09月02日 04:17/ 0 赞/ 152 阅读
相关 Qt学习2 摘自:http://www.devbean.net/2012/08/qt-study-road-2-catelog/ 经典的观察者模式在讲解举例的时候通常会举报纸和订阅 灰太狼/ 2022年08月07日 13:38/ 0 赞/ 121 阅读
相关 qt学习 摘自: http://www.devbean.net/2012/08/qt-study-road-2-catelog/ -------------------- 逃离我推掉我的手/ 2022年08月07日 12:58/ 0 赞/ 99 阅读
相关 Qt学习入门 Qt支持的平台包括Windows、Mac、Linux等桌面操作系统,QNX、VxWorks、Embedded Linux等嵌入式平台,还包括Android、iOS、WP/Win 蔚落/ 2022年08月07日 00:24/ 0 赞/ 137 阅读
相关 QT学习资源 1 [https://lug.ustc.edu.cn/sites/qtguide/contents.htm][https_lug.ustc.edu.cn_sites_qtgui 「爱情、让人受尽委屈。」/ 2022年08月02日 15:46/ 0 赞/ 124 阅读
相关 Qt学习笔记 Qt模态框 QDialog dialog = new QDialog(&w); dialog->setModal(true); dialog->s 偏执的太偏执、/ 2022年07月24日 12:29/ 0 赞/ 194 阅读
相关 Qt学习资源 `[使用 C++ 扩展 QML](https://www.devbean.net/2016/02/qt-study-road-2-extending-qml/)` [Qml 旧城等待,/ 2022年03月08日 21:09/ 0 赞/ 180 阅读
相关 QT入门学习 第一个QT程序 include<QApplication> include<QDialog> include<QLabel> include< 青旅半醒/ 2021年12月15日 02:43/ 0 赞/ 187 阅读
还没有评论,来说两句吧...