Qt5 UI信号、槽自动连接的控件重名

Qt5 UI信号、槽自动连接的控件重名

来源 http://blog.csdn.net/goldenhawking/article/details/51865909

对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 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题。

时间: 2024-10-13 03:19:26

Qt5 UI信号、槽自动连接的控件重名的相关文章

在cocos2d-js实现自动绑定cocostudioUI控件与事件

一.起因 在客户端游戏开发中最让人恶心的工作就是UI相关的东西,虽然有了像cocostudio这样的可视化工具,但界面中有大量需要由代码访问的控件的时候,需要写太多重复的代码例如: //加载UI配置文件 var root = ccs.uiReader.widgetFromJsonFile("res/cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json"); this._mainNode.addChild(root); /

在cocos2d-js实现自动绑定cocostudioUI控件与事件(二)

前两天有个刚学习使用cocos2d-js的同事问我,怎么实现一个功能:点击一个按钮UI显示计数加1,按住不放UI计数就不停的加. 这个功能不就是个长按事件吗?我给他描述了下实现长按事件的思路: 1. 在控件touchBegan时,使用 一次性定时器scheduleOnce传入touchLong函数,设定1秒后执行. 2.  touchLong触发时,开启schedule传入addOnce函数(ui显示计数加1),设定每0.1秒执行一次. 3.  在touchEnded时执行unschedule函

Android UI之android:layout_weight属性以及控件的比例控制

这两天在做一个Android界面的时候采用了linearlayout线性布局,并在其中放置了textview控件,设置android:layout_width属性为wrap_content时,eclipse提示说这里使用0dp取代wrap_content能获得更好的体验,顿时产生了好奇,为什么使用0dp会更好?于是探究了一番,网上已有相关的文章,学习之后作了一个总结. 首先解释一下Android:layout_weight属性的作用,其实简单理解就是用来分配空间大小,至于怎么分配,分配的是哪些空

pb自动注册ole控件

方法一:  1.手工注册OCX控件 将该控件随程序一起发布,然后,将此文件拷到windows\system,或者直接放在本运行目录,然后执行dos命令,run( "regsvr32   *.ocx ") *表示具体的文件.然后写注册表,将控件注册标志置为1,在程序开始运行时,先检查该标志,是否需要进行注册 2.自动注册OCX控件 在OCX控件中一般都包含一个DLLRegisterServer函数,可以用此函数来实现OCX控件自动注册. 例如:我们要在应用中自动注册ActiveMovie

深入Windows窗体原理及控件重绘技巧

之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望这篇文章可以帮你解惑. 1.Windows窗体原理 首先,如果看过Win32 SDK编程的都知道Windows的三大核心系统:负责窗口对象产生和消息分发的USER模块,负责图像显示绘制的GDI模块,负责内存.进程.IO管理的KERNEL模块.试想象一下如何在一个像素阵列上产生窗口对象,其实就是使用G

阻止控件重绘

//控件重绘 [DllImport("USER32.DLL ", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool SendMessage( IntPtr hWnd, // 目标窗口句柄 int Msg, // 消息 bool wParam, // 第一个消息参数 false阻止 true不阻止 int lParam ); const int WM_GETTEXT =0x000B; SendM

Qt connect parent widget 连接父控件的信号槽

Qt中的信号槽系统是不同类中间传递数据的神器,如果连接父子空间之间的信号槽很重要,在父类中实例化子类的时候一定要注意将父类连上,不然信号槽无法使用,比如若子类是个对话框Dialog类,一定不要忘了加this QtClass *qc = new QtClass(this); qc->exec(); 然后如果需要连接到父控件的槽函数,只需在子类的构造函数中加一句: connect(this, SIGNAL(signal()), parentWidget(), SLOT(slot()));

【Qt UI】仿QQ表情选择控件

表情选择控件在聊天应用中经常要用到,做起来虽然不复杂但是很繁琐,特别是有些图标需要按顺序排列.每次重做必然是很费时,所以我将聊天表情选择控件封装成一个独立的类QFaceSelectWidget,方便直接应用到自己的项目中. 先来看看效果图: 测试程序是一个对话框,里面放有一个QPushButton和一个QLabel,水平布局.点击按钮弹出"表情选择框",选择表情后"表情选择框"关闭,QLabel中显示刚才选择的表情."表情选择框"中的表情都是gi

Delphi连接Oracle控件ODAC的安装及使用

Delphi ODAC 控件下载 ODAC 64位客户端 12.1.0.2.4 http://down-ww3.7down.net/pcdown/soft/xiazai/odac-x64.rar Delphi连接Oracle有很多种方式,但大多要在客户机上安装Oracle那庞大的客户端,比较不方便,使用ODAC控件连接Oracle则免去了这些麻烦.ODAC也是Oracle公司载发的控件.有for Delphi 6--Dephi 2007的版本. Oracle数据访问组件(ODAC),全称:Ora