为你敲开 Qt 的大门

目前我们已经有了第一个 hello-qt 程序,它能在屏幕上创建一个窗口,显示 “Hello, Qt!”字符。但是它不能响应用户的操作,我们来将 hello-qt 修改一下,用 QPushButton 替换 QLabel。然后将这个 QPushButton 对象与主程序的退出操作[1]连接在一起,当我们点击 QButton 对象的时候,主程序退出。

依然在 hello-qt 项目文件夹中,将 main.cpp 的源码修改成下面的样子:

1
2
3
4
5
6
7
8
9
10
11
12
#include <QApplication>
#include <QPushButton>
 
int main(int argc, char*argv[])
{
    QApplication app(argc, argv);
    QPushButton button("Hello, Qt!");
    QObject::connect(&button, SIGNAL(clicked()),
                     &app, SLOT(quit()) ); 
    button.show();
    return app.exec();
}

由于项目没有新增文件,就不需要改动 hello-qt.pro 的内容了,这次编译只需运行两条命令

1
2
qmake
make

然后运行 ./hello-qt,你会看到程序运行的界面。

图 3.2 带按钮的 hello-qt

图 3.2 带按钮的 hello-qt

跟早前的 hello-qt 相比,按钮版的 hello-qt 还多了一个特性:当你按下这个 “Hello, Qt!” 按钮之后,程序退出了。

你应该发现了,这其中的奥秘就是新增的一个代码行:

8
9
    QObject::connect(&button, SIGNAL(clicked()),
                     &app, SLOT(quit()) );

QObject::connect() 方法在 Qt 中用于将 QObject 对象的“信号”和“槽”(signal-slot)连接起来,信号和槽将会在 3.5 信号-槽机制中讲解。

当前这句 connect 语句的意义是:当 button 发出 clicked() 信号的时候,触发 app 对象的 quit() 操作。那么什么时候 button 会发出 clicked() 信号呢?顾名思义,就是界面上的 button 按钮被用户点击的时候。

下一节开始讲解 Qt 中的 QObject 和信号-槽机制,理解了这两个概念,就会对 Qt 中的对象通信、操作响应有了清晰的印象。

————————————————
[1] 稍后你会知道这在 Qt 中称为“槽”

§115 · By Rei · 09月 14, 2010 ·