Qt5 UI信号、槽自动连接的控件重名大坑(UI生成的槽函数存在一个隐患,即控件重名。对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题)
2023-09-11 14:19:08 时间
对Qt5稍有熟悉的童鞋都知道信号、槽的自动连接机制。该机制使得qt designer 设计的UI中包含的控件,可以不通过显式connect,直接和cpp中的相应槽相关联。该机制的详细文章见
http://doc.qt.io/qt-5/designer-using-a-ui-file.html#automatic-connections
简而言之,UI中的一个object name, 可以直接与code中的槽
void on_<object name>_<signal name>(<signal parameters>);
对应,这样,在利用designer 做UI的时候,就可以很方便地完成信号槽连接,无需添加任何代码。
然而,这种机制存在一个隐患,即控件重名。虽然designer 在开发一个UI文件时,会自动为同类控件的不同实例计数,然而,当一个 UI 作为widget嵌入另一个主窗口时,却不会检查控件重名。
举例而言,假设一个日期控件widget上有个按钮叫“同步”(pushButton_syn),然后,整个日期控件作为一个widget,嵌入到主窗口(Dialog)里。恰好,主窗口中有一个按钮,也叫 pushButton_syn,好了,问题出现。在主窗口构造时,调用 setUpUI() 创建各个按钮以及控件,而后调用自动连接代码:
QMetaObject::connectSlotsByName(Mydialog);
该代码会根据目前.h中定义的符合on_objname_slot 格式的槽,到界面元素里查找对应控件。是与主窗口的pushButton_syn关联,还是与日期控件中的pushButton_syn关联,完全取决于二者的创建顺序,是不靠谱的。
为了避免这个情况,建议:
1、对可重用的含有复杂子界面的widget,设计时全部使用难以发生碰撞的名字规则,比如,
pushButton_MyCtrl_syn
2、建议对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题。
相关文章
- Python logging日志的自动分割
- PC-ADSL开机自动拨号方法
- 根据标题自动生成图片程序,使用教程,并附程序下载
- 自动生成百度小程序sitemap.txt文件路径
- 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码
- 机器学习笔记 - 自动编码器autoencoder
- 从解读 BDC 自动生成的代码谈起,讲解 SAPGUI 的程序组成部分试读版
- paip. 解决java程序不能自动退出
- Android Studio 如何设置自动删除无用的包、自动导入包
- python之自动发送微信消息
- Windows7 PSR通过程序调用并自动开始记录
- AutoML之flaml:基于OpenML数据集利用flaml框架自动寻找最优算法及其对应最佳参数(对比lightgbm和xgboost算法)实现预测航班是否延误二分类任务案例之详细攻略
- 利用Python实现直播弹幕自动发送小程序~
- python带你制作自动答题程序,速度超越98%人
- 实战案例丨ModelArts在数据标注、数据过滤上的应用技巧:自动分组
- 简单好用,分享 4 款 Pandas 自动数据分析神器
- Python编程:fire库自动生成命令行接口
- Docker 将已经部署的容器设置为自动启动
- 不同编程语言的程序,能够被 ChatGPT 自动生成的可能性的一些思考
- 单片机——自动浇花系统