上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.3 关联操作
在Qt应用程序的用户界面加入“关闭”按钮后,应用程序并没有响应关闭操作。这是因为程序还没有将相应的信号和槽关联起来。
Qt提供了信号和槽机制来完成界面操作的响应。因此,为了响应用户的关闭操作,需要将“关闭”按钮发送的单击信号QPushButton::clicked() 和窗口部件QWidget的QWidget::close() 槽关联起来。关联信号和槽的代码如下(省略了包含头文件部分)。
int main(int argc, char* argv[]) { QApplication app(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030")); QWidget* pWidget = new QWidget; QLabel label(pWidget); label.setText(QObject::tr("同一个世界,同一个梦想!")); QPushButton* btn = new QPushButton(QObject::tr("关闭"), pWidget); QVBoxLayout* layout = new QVBoxLayout; layout->addWidget(&label); layout->addWidget(btn); pWidget->setLayout(layout); QObject::connect(btn, SIGNAL(clicked()), pWidget, SLOT(close())); pWidget->show(); return app.exec(); }
函数QObject::connect()将“关闭”按钮btn的clicked() 信号同窗口pWidget的close() 槽关联起来。QObject::connect()函数中,实参btn是发信号的源对象指针,实参pWidget是接受信号的目标对象指针;clicked()信号和close()槽已经分别由Qt的QPushButton类和QWidget类定义了,所以无需事先声明和定义就可以直接使用;SIGNAL()和SLOT()是Qt定义的两个宏,它们返回其参数的C风格字符串(const char *)。
此处,程序使用了QObject对象的静态函数connect(),此外QObject类还提供了非静态形式的connect() 函数。继承自QObject的Qt类都具有支持信号和槽的能力,并且可以在子类的实现代码中直接使用connect()函数。
关于Qt信号和槽机制的详细描述见第3章。在此,只是简单地介绍一下基本的应用知识。
现在,重新编译、连接并运行hello应用程序。单击“关闭”按钮,OK!应用程序立刻消失得无影无踪了。