精通Qt4编程
上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!应用程序立刻消失得无影无踪了。