zoukankan      html  css  js  c++  java
  • Qt5 UI信号、槽自动连接的控件重名大坑(UI生成的槽函数存在一个隐患,即控件重名。对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题)

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

    版权声明:本文为博主原创文章,转载时请注明 http://blog.csdn.net/goldenhawking https://blog.csdn.net/goldenhawking/article/details/51865909
     
    唉,不仅仅是重名的问题。我还碰到更郁闷的问题: 在UI设计器里面,拖了一个button ,转到槽,自动创建好了后。 我觉得控件名字不好,我又在设计器里面改了名字并重新生成槽,并把原来的槽在代码里删除。MD问题来了,编译都过不了,说找不到原来的槽。我知道IDE是自动生成了代码,于是我全部清除,重新编译,还是通不过。这真是个大坑啊 。。。。。
  • 相关阅读:
    HTML元素解释
    Java命名规范
    HDU 1058 Humble Numbers(DP,数)
    HDU 2845 Beans(DP,最大不连续和)
    HDU 2830 Matrix Swapping II (DP,最大全1矩阵)
    HDU 2870 Largest Submatrix(DP)
    HDU 1421 搬寝室(DP)
    HDU 2844 Coins (组合背包)
    HDU 2577 How to Type(模拟)
    HDU 2159 FATE(二维完全背包)
  • 原文地址:https://www.cnblogs.com/findumars/p/9091300.html
Copyright © 2011-2022 走看看