按钮是一个部件,因此它可以像其它部件一样进行显示。但是,在用户点击按钮的时候你的程序必须知道并做出响应。下面的例子用于退出程序响应按钮动作。
1 /* exitbutton.cpp */
2 #include <qapplication.h>
3 #include <qpushbutton.h>
4 #include <qstring.h>
5
6 int main(int argc, char **argv)
7 {
8 QApplication app(argc, argv);
9 QString string("Exit");
10 QPushButton *button = new QPushButton(string, NULL);
11 QObject::connect(button,
12 SIGNAL(clicked()), &app, SLOT(quit()));
13 button->setGeometry(0, 0, 80, 50);
14 button->show();
15 app.setMainWidget(button);
16 return(app.exec());
17 }
这个按钮准备响应鼠标事件,但如果这个按钮没有被编写成向程序的某部分发送消息,那么这个按钮将对鼠标没有任何反应。这种类型的消息之一是signal(信号),能够接收信号的方法叫做slot。在第10行和第11行调用QObject::connect()将把信号的一个拷贝从按钮的clicked()方法指向应用程序的quit()方法。
注意:如果从事过其它事件驱动系统的开发,那么读者很可能熟悉“回调”函数的概念。slot类似于回调函数,但有一些不同。主要的差别是slot保证类型安全,即如果参数的类型不匹配,那么程序将不能编译。
在调用QObject:connect()时,前两个参数指明了信号的来源为按钮中的clicked()方法。这个信号就被广播出去,这是无论普无设置接收它的slot函数,信号都将被发出。另一方面,如果几个slot都被设置成接收这个信号,那么它们都将收到一个信号的一个拷贝。
在调用QObject::connect()中,后两个参数指明了接收的slot是QApplication对象中的quit()方法。