高端网站 设计,网站数据包如何做架构,古典 网站模板,线上网站开发系统流程图背景#xff1a;
一个包含了组件提升的ui#xff0c;有个按钮的槽函数就是不响应#xff0c;于是找原因。
分析#xff1a;
槽函数的对应一是通过connect函数绑定信号#xff0c;二是on_XXX_signal的命名方式。界面上部件的槽函数通常是第二种。
我反复确认细节#…背景
一个包含了组件提升的ui有个按钮的槽函数就是不响应于是找原因。
分析
槽函数的对应一是通过connect函数绑定信号二是on_XXX_signal的命名方式。界面上部件的槽函数通常是第二种。
我反复确认细节就是找不到问题。直到跟踪moc文件发现qt_static_metacall函数都不执行。
之前还写过一篇博客
qt槽函数重写问题qt_metacall和qt_static_metacall-CSDN博客
为了测试原因我几乎点了界面上所有的按钮其它都可以执行qt_static_metacall直到发现一个低级原因界面上如果用嵌套方式里面又套了一层widget并让它提升为另一个自定义的界面其中有个按钮的名称和外面的重复这就不行了。比如
原因 如图所示一个主ui中嵌套了一个子ui子ui里面有个pushButton1主ui里也有一个这样就不行。按理说这就好比函数或者模块化设计分离开来就是怕乱但是不行分离开也要注意命名。
在cpp的构造函数中通常有个setupUi函数而它存在于ui_XXX.h当中这就是原因。
主ui的cpp的ui_头文件中一定会有子ui的ui_头文件。正如我的ui里放了个按钮那么它的ui_头文件里一定会有#include QPushButton。要不构造的时候调用setupUi怎么生成这个按钮
所以放眼主ui的cpp文件开头一定是
#include my_ui.h
#include ui_my_ui.h
按上图的意思ui_头文件当中展开成了
#include my_ui.h
...
#include my_sub_ui.h
...
而主ui和子ui中都有一样名字的按钮pushButton1所以my_ui.h和my_sub_ui.h中也一样会有两个槽函数的声明on_pushButton1_clicked。编译器咋整如果按照名字匹配信号槽效果跟connect是一样的但又不完全一样主界面中的槽函数等于被覆盖了所以有效的永远是子ui中的槽函数。
乱七八糟的不知道说明白了没有。毕竟qt按照名字on_XXX_signal匹配信号槽的做法跟connect还是有区别这个感兴趣可以分析源码。
结论
所以如果有ui嵌套控件命名一定不能重复。