Qt_4——SignalSlot

来源:互联网 发布:浙江省软件企业协会 编辑:程序博客网 时间:2024/04/28 06:20

因为上一篇我们讲到了信号和槽的概念,所以今天我单独拿出一个信号和槽的程序来加深大家对它的理解,就让我们开始对SignalSlot的旅程吧:)

用Qt Creator新建一个Qt C++ Project→Mobile Qt Application,命名为SignalSlot。

只需修改main.cpp文件的代码,其它文件不用动:

#include <QtGui/QApplication>

#include <QVBoxLayout>
#include <QPushButton>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);   
    QWidget window;
    QVBoxLayout* layout = new QVBoxLayout(&window);
    QPushButton* exitButton = new QPushButton("exit");
    QObject::connect(exitButton,SIGNAL(clicked()),&a,SLOT(quit()));
    layout->addWidget(exitButton);
    window.show();
    return a.exec();
}
然后运行程序便得到如下图:

当我们点击程序中的exit按钮时,这个程序就退出了。

大家应该看到了,在程序中我们第一次用到了QWidget这个类,它经常被当做其它widget的容器或者为子类创建自己的widgets。这里我们创建了一个QWidget实例window

接着我们用到了layout管理器QVBoxLayoutQWidget的实例window被作为一个参数&window传递给QVBoxLayout,来告诉QVBoxLayout需要对windowlayout进行响应。正如你从图中看到的结果,它可以使建立起来的widget根据实际界面空间大小去自适应而不需要我们手动事先设好,当然了,也可以自定义。而如果使用纯C++去写是一定要自己设置的,因为没有layout manager可用。

然后是定义一个QPushButton类的一个按钮。当这个按钮被按下去的时候就会产生一个signal,这个signal被发送给一个slot

接下来就是我们的关键了,信号和槽华丽登场。先是调用QObject::connect函数来创建一个介于信号和槽之间的连接。而槽就是匹配特定信号,一旦接收到信号就会执行的一个标准C++方法。在Qt widgets中已经为我们提供了许多预定义的槽了,而且你也可以通过Qt中那些子类来增加附加槽,这也包括QObjectQObject::connect函数的前2个参数给出了信号传递的信息:信号发送者和一个指向特定槽的信号。相对应的后2个参数给出了信号接收的信息:信号接收者和一个带有特定方法的槽。在connect()的调用中,信号和槽都被分别放在了signal()slot()宏中。这2个宏确保了当它们之间要传递参数时,类型可以是预定义的,比如string值。另一个可见的优点是,在建立连接的时候Qt可以检查信号的兼容性。

QObject::connect函数的后一条语句是将我们的关闭按钮exitButton附加到QVBoxLayout中,然后由QVBoxLayout来管理它。这样exitButton就像QVBoxLayout的孩子一样,当window执行显示函数show()时,exitButton的老子QVBoxLayout显示在屏幕上时,也自动把孩子们都拉出来了。而不需要一个个去显示。

最后我们调用了QApplication对象aexec()函数来开始我们整个程序的事件循环(event loop),也就是让程序跑起来了:)

 

 

原创粉丝点击