• 13136阅读
  • 12回复

setupUi()引起的麻烦 [复制链接]

上一主题 下一主题
离线sundp
 

只看楼主 倒序阅读 楼主  发表于: 2009-03-31
— 本帖被 XChinux 执行加亮操作(2010-11-12) —
由.ui文件生成的类的构造函数里都有一个setupUi(this)。这个函数的作用是对界面进行初始化,它按照我们在Qt设计器里设计的样子把窗体画出来,把我们在Qt设计器里面定义的信号和槽建立起来。也可以说,setupUi 是我们画界面和写程序之间的桥梁。
但有一点需要注意的是,setupUi在执行的时候会触发界面上的事件。如果忽视了这点,那可能就会遇到一些莫明其妙的麻烦。
我曾在一个类的构造函数里这样写:

    setupUi(this);    //系统自动生成的
    bool flag=false;    //对我自己定义的变量初始化
    ...

界面上有一个tabWidget,我定义了一个槽来接收tabWidget的tabClicked()信号,在该槽里用到flag变量。
调试程序中发现此类不稳定,经常会在类生成时突然跳出,什么提示也没有。
起初我以为类的构造函数应该是最先执行的,构造完成之后这个类才开始正式运转,发生各种信号和槽的关系。这么考虑起来,这个类没有任何理由不稳定。可是从现象上看,一定是有某个地方有内存操作的异常,这个异常引起了程序的不可靠。
问题出面哪里?
我怀疑过开发环境,于是从QDevelop环境迁移到了QCreator,不管用。怀疑过操作平台,换了几个Linux的发行版,也不好使。
后来在QCreator的调试模式下运行,在系统崩溃后查看调用栈时发现,类生成的过程里,居然触发了好多窗体上的事件!
这一定是setupUi运行时发生的事。
因为在类的构造函数里我把自己定义的变量初始化都放到了setupUi之后,这样,在窗体事件时用到了一些未初始化的变量,从而引起系统不可靠。
后来修改了类的构造函数,把setupUi移到变量初始化的后面,于是问题全部解决。
人境结庐<http://sundp70.blog.163.com>心远地偏
离线浪迹江湖

只看该作者 1楼 发表于: 2009-04-03
谢谢楼主的精彩解释,学习了,顶一下
离线joetaiyuan
只看该作者 2楼 发表于: 2009-04-03
引用楼主sundp于2009-03-31 22:27发表的 setupUi()引起的麻烦 :
由.ui文件生成的类的构造函数里都有一个setupUi(this)。这个函数的作用是对界面进行初始化,它按照我们在Qt设计器里设计的样子把窗体画出来,把我们在Qt设计器里面定义的信号和槽建立起来。也可以说,setupUi 是我们画界面和写程序之间的桥梁。
但有一点需要注意的是,setupUi在执行的时候会触发界面上的事件。如果忽视了这点,那可能就会遇到一些莫明其妙的麻烦。
我曾在一个类的构造函数里这样写:

    setupUi(this);    //系统自动生成的
.......


我感觉ui文件的作用只用于做界面就好
其他的信号槽机制还有变量定义还有setText()等等都在代码里面做。
离线zhshzhjhust
只看该作者 3楼 发表于: 2009-04-03
好贴

感觉自己对UI机制这块理解的还不够深入,所以我一般是直接写代码

呼唤更多好贴
离线jerychang
只看该作者 4楼 发表于: 2009-06-05
感觉你那个flag变量最好放在UI文件里面,那样封装是不是更好呢..
QT HAO..
离线sundp

只看该作者 5楼 发表于: 2009-06-05
UI文件里的东西都是由.ui文件生成的, 我不想破坏它的完整性。手工修改UI文件不是不行,只是一旦界面需要修改,那么每修改一次.ui文件之后,你都要记得手工修改一下UI文件,太麻烦。
人境结庐<http://sundp70.blog.163.com>心远地偏
离线zealane

只看该作者 6楼 发表于: 2009-06-06
恩。教训,值得后人学习。
离线jasen1982
只看该作者 7楼 发表于: 2009-06-06
好贴~
支持一下
离线wader
只看该作者 8楼 发表于: 2009-06-06
学习了
离线snowdream
只看该作者 9楼 发表于: 2010-03-09
太精彩了,可能我最近纠结的问题原因也在这里。
QQ:273247606
希望与大家一起交流QT~
离线lishiyong110
只看该作者 10楼 发表于: 2010-03-10
恩 讲的精到 虽然我没遇到过 但以后ui文件还是应该只画窗口 其他的还是代码来的安全...
静下心来学习
离线草也
只看该作者 11楼 发表于: 2010-11-12
回 楼主(sundp) 的帖子
http://www.yafeilinux.com/?p=43
在这个例子中,
ui->setupUi(this);
    ui->label->setText(tr("按下键盘上的A键试试!"));
    ui->pushButton->setText(tr("按下鼠标的一个键,然后移动鼠标试试"));
    //ui->setupUi(this);
setupUi(this)放在后面的时候老是提示内在错误,放在前面的时候就正常了,正好跟楼主说的情况相反。我估计是这个函数要先初始化后,我才能申明我的函数。
我不知道怎么DEBUG调试,望指教,谢谢!
离线redfox945

只看该作者 12楼 发表于: 2011-11-23
恩 很好的帖子 本人初学 感觉对我是个很大的提醒哦 以后也会注意这方面的
快速回复
限100 字节
 
上一个 下一个