Qt 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能.![]() Qt有两个重要概念:“信号和槽”和“布局”。 Qt用“信号和槽”代替windows编程中的callback机制,通过“信号和槽”来完成不同对象之间的通信,以及完成相应用户的操作,可以用于任何QObject的子类中,这使得各个元件 之间的协同工作变得十分简单。 槽和普通的C++成员函数几乎是一样的:可以是虚函数,可以被重载,可以是共有的,保护的或私有的,并且也可以被其他C++成员函数直接调用,参数也可以是任意类型。 不同之处是:槽可以和信号连接在一起,在这种情况下,每当发射这个信号的时候,就会自动调用这个槽。 connect()语句如下connect(sender,SIGNAL(signal),receiver,SLOT(slot)); 这里的sender和receiver是指向QObject的指针,signal和slot是不带参数的函数名,“信号和槽”的一些性质如下: 1.一个信号可以连接多个槽 在发射这个信号的时候,会以不确定的顺序一个接一个地调用这些槽。 2.多个信号可以连接同一个槽 3.一个信号可以与另外一个信号相连接 connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SIGNAL(updateRecord(const QString &))); 当发射第一个信号时,也会发射第二个信号,除此之外,信号与信号的连接,和信号与槽的连接是难以区分的。 4.连接可以被移除 disconnect(...) 5.signal和slot必须有相同的参数类型,如果信号的参数比它所连接的槽的参数多,那么多余的参数将会被简单地忽略掉。如果参数类型不匹配,或在信号和槽的名字中包含了参数名,Qt也会发出警告。 ![]() 布局:用来管理窗口中窗口部件的几何形状,能对其所负责的窗口部件的尺寸大小和位置进行设置,Qt主要有三种布局管理器类: QHBoxLayout:在水平方向上排列窗口部件,从左到右。 QVBoxLayout:在竖直方向上排列窗口部件,从上到下。 QGridLayout:把各个窗口部件排列在一个网格中。 emit是Qt中的关键字,它能发射信号,像其他Qt扩展一样,它也会被C++预处理器转换成标准的C++代码。 元对象系统(meta-object system) Qt的一个最主要的成功是对C++扩展,即把彼此独立的软件模块连接起来,而不需要模块间的任何细节。 这个机制就是Meta-Object系统,它提供了两个关键的用途:信号和槽 与 introspection(内省)。introspection功能允许应用程序在运行时得到QObjec它子类的“meta-information”,这对实现信号和槽是很必要的,包括全部信号和槽的列表,以及类的名字。这个机制还提供了属性(在Qt Designer中使用)和文本翻译(国际化)支持。它们构成了QSA(Qt Script for Application)的基础。 标准C++不提供Qt meta-object系统需要的动态meta-information。Qt提供了一个独立的工具moc,通过定义Q_OBJECT宏实现到C++函数的转变。moc是用纯C++实现的,因此可以使用在任何C++编译器中。 这个机制工作过程如下: Q_OBJECT声明了一些QObject子类必须实现的内省函数:metaObject(),TR(),qt_metacall()等。 Qt的moc工具实现Q_OBJECT宏声明的函数和所有的信号。 QObject成员函数connect()和disconnect()使用这些内省函数实现信号和槽的连接。 ![]() 以上这些是通过qmake,moc和QObject自动处理的,程序员通常不用考虑它们。如果你感到对此好奇,可以查看QMetaObject类文档和moc实现的C++代码。 关注公众号【技术让梦想更伟大】,获取更多Linux/C/C++/Python/FPGA等原创技术文章。后台免费获取经典电子书籍和视频资源,实时更新,原创不易,请多支持,谢谢! ![]() ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:技术让梦想更伟大,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |