QT ui 带来麻烦

setupUi()引起的麻烦

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

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

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

时间: 2024-10-27 17:17:36

QT ui 带来麻烦的相关文章

qt ui程序使用Linux的文件操作open、close (转)

原文地址:qt ui程序使用Linux的文件操作open.close 作者:kjpioo 提出这个问题是因为在qt的QWidget类型的对象中,close()函数会和QWidget::close()冲突,如果在类函数实现时直接用close(),在程序编译时会提示提示错误(具体什么错误不记得了). 错误原因是QWidget::close()与stdio.h中的文件关闭标准函数close()产生了歧义.所以可以参考下文链接中的解决方案. http://bytes.com/topic/c/answer

[致歉]2:05-6:35部分站点出现故障,给您带来麻烦,请谅解

今天凌晨,数据库服务器(阿里云RDS)IP发生了变更,阿里云也提前进行了通知. 由于我们在hosts文件中进行了数据库服务器IP的绑定(为了减少DNS解析的开销),所以在这次数据库服务器IP变更之前,我们需要去掉所有服务器hosts文件中的IP绑定. 但是在操作时,我们漏掉了2台提供后端服务的服务器,造成今天凌晨2:05-6:35部分站点(i.cnblogs.com, q.cnblogs.com, home.cnblogs.com, passport.cnblogs.com)无法正常访问,部分功

QT ui基础(一) QT dialog 及UI 关系

2016-09-17 19:41:20|  分类: QT QT ui基础(一)  QT dialog 及UI 关系 #ifndef MYWIDGET_H#define MYWIDGET_H #include <QWidget>//#include "mydialog.h"namespace Ui {    class MyWidget;}class MyDialog;class MyWidget : public QWidget{    Q_OBJECT public:  

QT UI 基础(二)编译原理及文件结构

uic读取由QtDesigner生成的XML格式的用户界面定义文件(.ui文件),然后生成其对应的C++头文件. 若界面文件为ZZZ.ui,则对应生成的头文件为ui_ZZZ.h.默认情况下: ①基于QMainWindow的程序,会生成一个叫ui_mainwindow.h的头文件 ②基于QDialog的程序,会生成一个叫ui_dialog.h的头文件 ③基于QWidget的程序,会生成一个叫ui_widget.h的头文件 由Qt Creator自动完成的工作有如下: (1)在生成的头文件中,首先会

征信逾期给我们带来麻烦

这几年,伴随着我国信用体系的深入建设,国家也特别重视个人征信的问题,对于失信人员的打击力度也是越来越大,导致失信人员目前在社会上也是寸步难行.另一方面,随着信用卡大量使用和网贷平台app的大量兴起,使得失信人群的人数不断增加.随着信用卡和网贷的增多,逾期的人也是越来越多,很大一部分人在不经意间征信就出现了问题,一个不小心忘还了信用卡就会出现逾期.随着征信修复的兴起,很多类似公司如雨后春笋般冒出来了,那么征信修复公司合法吗?这个要看是否正规的征信公司了.其实,对于个人征信逾期,想必很多小伙伴都遇到

qt ui界面控件布局设计

1.布局控件简介: 水平布局,里面的控件将水平展示,布局器里面的控件大小若没有固定,其大小将随着布局的大小而自动拉伸.可以通过设置其左(layoutLeftMargin).上(layoutTopMargin).右(layoutRightMargin).下边距(layoutBottomMargin)来调整里面控件相对于布局的边距,控件之间的宽度可以通过layoutSpacing属性进行设定.在Qt Designer里,可以先拖拽控件至窗口中,然后进行点击水平.垂直布局等实现布局,也可以先拖拽布局,

批量操作QT UI中的控件

背景:在一个项目中,可能一个UI中存在大量相同的tablewidget,combobox,label等控件,每种可能有100个,此时想对它们进行同样的操作 方案:(以tablewidget为例,UI中有名称为tablewidget_1到tablewidget_10的10个tablewidget) 自然想到的是一个一个的操作,对它们的属性进行修改.设置,虽然可以实现,但是工作量太大 QList<QTableWidget *> tablewidgetlist = this->findChil

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

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

QT UI 如果发现布局之后,button不在父widget的中间

如果发现布局之后,button不在父widget的中间: 调整父widget的布局参数: