2.3信号和槽(中)

2.3.1在ui中编辑信号槽

这一小节我们来看一下如何在ui中编辑信号槽。

新建GUI项目SignalsAndSlots2,类名SignalsAndSlots2,基类选择QWidget。打开ui文件。在编辑界面中拖入一个ProgressBar和一个PushButton

此时,会弹出连接窗口,勾选左下角“显示从QWidget中继承的信号和槽”,信号选择toggled(bool),槽选择setVisible(bool)。

运行程序,弹起按钮,进度条隐藏,按下按钮,进度条显示。

此时,我们再打开生成的ui_文件,看到下面这行代码:

QObject::connect(pushButton,SIGNAL(toggled(bool)),progressBar,SLOT(setVisible(bool)));

我们编辑的信号槽已经被写到这个头文件中了。

2.3.2通过对象名关联信号槽

继续切回到ui界面,在pushButton上右击,选择“转到槽”,在弹出的对话框中选择toggled(bool)。此时,在头文件和源文件中已经增加了on_pushButton_toggled()函数,在函数体中输入如下代码:

voidSignalsAndSlots2::on_pushButton_toggled(boolchecked){if(checked){ui-pushButton-setText("隐藏进度条");}else{ui-pushButton-setText("显示进度条");}}

我们打开ui_文件,发现又多了一行

QMetaObject::connectSlotsByName(SignalsAndSlots2);

由此,我们总结信号槽自动关联规则如下:

使用QObject::setObjectName()方法为对象设置名称。

调用QMetaObject::connectSlotsByName()启用自动关联。

用下划线"_"将"on",“对象名”,“信号名”连接后命名的函数,即:on_对象名_信号名(参数)

这样就可以实现信号槽的自动连接啦。

2.3.3QSignalMapper

这个过程无疑是繁琐的,为此,Qt提供了QSignalMapper这个类来解决这个问题。同时,这个类可以连接多个按钮,匹配发送信号的对象对应的整数、字符串,窗口指针,继承于QObject的对象参数重新发送它们。

现在我们创建一个类似计算器的窗口。

新建GUI项目SignalMapperWidget,类名SignalMapperWidget,基类选择QWidget。在构造函数中添加如下代码

编译并运行。

2.3.4相关函数2.3.4.1获取信号发送者

当多个信号连接一个槽时,有时需要判断是哪个对象发来的,那么可以调用ser()函数获取对象指针,返回为QObject指针。

QObject*ser();

2.3.4.2解绑定信号槽

当我们不需要信号槽连接时,可使用disconnect()进行解绑定。其写法和connect一样,只需要将connect换成disconnect即可。

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐