UI Designer设计出的自定义控件,如何让其构造函数接受多个参数?


我有一个mainDialog,是UI Designer设计的,其中有一个自定义控件,是由普通widget提升得到的。当然,我可以在这个自定义控件的构造函数中添加参数,但Qt工具生成的ui_mainDialog.h文件中会自动创建自定义控件,例如widget = new QtCustomWidget(mainDialog),其构造函数只有的一个QDialog类型的参数,这样就会引起编译错误。

请问该如何做,既可以让自定义控件借助UI designer来设计界面,又可以让我把自定义控件的创建步骤放在mainDialog的构造函数中,自己来掌控,而不是让UIC自动创建呢?

我不需要把这个自定义控件集成到UI designer中去,因为不是常用的常规控件。

15 个解决方案

#1


重载一个带多参数的构造函数。在new的时候把参数依次传递进去就可以了。

#2


引用 1 楼 livealearn 的回复:
重载一个带多参数的构造函数。在new的时候把参数依次传递进去就可以了。


大概你没明白我的意思,现在的问题是uic生成的cpp文件中会自动new那个widget,并调用默认的构造函数,我总不能在主对话框的构造函数里先delete,再重新用重载的构造函数new一次吧,这样显得太笨拙了。

#3


把uic生成的.h和.cpp的类不动,在这个类的基础上继承出一个新类,构造函数可以有多个参数。
把易变的和基本不变的分离。

#4


引用 3 楼 die654456 的回复:
把uic生成的.h和.cpp的类不动,在这个类的基础上继承出一个新类,构造函数可以有多个参数。
把易变的和基本不变的分离。


谢谢你的建议,但是这样还是无法解决我的问题,因为无论外面怎么改,UIC生成的主对话框的ui_mainDialog.h文件里面还是会有widget = new QtCustomWidget(mainDialog)这样的初始化语句。现在我是想回避掉这条自动生成的语句。

#5


你用文本编辑器打开mainDialog.ui这个文件,看到下面的这种xml文件信息
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainDialog</class>
 <widget class="QDialog" name="MainDialog">
把MainDialog替换成你继承出来的新类试试?

#6


引用 5 楼 livealearn 的回复:
你用文本编辑器打开mainDialog.ui这个文件,看到下面的这种xml文件信息
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainDialog</class>
 <widget class="QDialog" name="MainDialog">
把MainDialog替换成你继承出来的新类试试……


怎么去替换主对话框呢,更不明白了,mainDialog.ui是类似这样的:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>mainDialogUI</class>
 <widget class="QDialog" name="mainDialogUI">
  <property>
  ...
  </property>
  <widget class="QtCustomWidget" name="widget" native="true">
   <property>
   ...
   </property>
  </widget>
  <layoutdefault spacing="6" margin="11"/>
 <customwidgets>
  <customwidget>
   <class>QtCustomWidget</class>
   <extends>QWidget</extends>
   <header>QtCustomWidget.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
</ui>

#7


不要用designer设计的UI,自己从新写一个widget。细粒度操作。

#8


引用 6 楼 rm_ryt 的回复:
引用 5 楼 livealearn 的回复:
你用文本编辑器打开mainDialog.ui这个文件,看到下面的这种xml文件信息
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainDialog</class>
<widget class="QDialog" name="MainDialog">
把……


<class>mainDialogUI</class>
<widget class="QDialog" name="mainDialogUI">
mainDialogUI就是你的主对话框吧?
他是从QDialog类继承来的,你将mainDialogUI改成你自己写的窗口类试试?

#9


重写一个新类,让这个类继承ui设计器生成的类
在这个新类中做你想做的一切。
ui设计器生成的代码是不能随便动的。

#10


引用 9 楼 su583304195 的回复:
重写一个新类,让这个类继承ui设计器生成的类
在这个新类中做你想做的一切。
ui设计器生成的代码是不能随便动的。


UIC自动生成的代码中,就是一个新类,包含一个UI设计器生成类的指针,其实和集成设计器生成类差不多,只是它用的聚合方式。就算我写一个新类集成设计器的类,那同样会把其创建自定义控件的那条语句继承过来,还是解决不了问题,除非重写setupUi函数,这么一来,使用UI designer就无意义了。

#11


ui_mainDialog.h是自动生成的,里面带有setupUi函数,我大概明白楼主的意思了,是在一个窗体中的某个控件在setupUI里面被自动创建了。
其实我觉得楼主完全可以换个思路,不要把代码全写在widget的构造函数内,把需要执行的代码,安排在父窗口的ui->setupUI()之后执行就可以了吧?

#12


引用 11 楼 livealearn 的回复:
ui_mainDialog.h是自动生成的,里面带有setupUi函数,我大概明白楼主的意思了,是在一个窗体中的某个控件在setupUI里面被自动创建了。
其实我觉得楼主完全可以换个思路,不要把代码全写在widget的构造函数内,把需要执行的代码,安排在父窗口的ui->setupUI()之后执行就可以了吧?


袍哥,你终于明白我的意思了,确实,可以在父窗口的构造函数里,setupUi之后用一系列set*函数来给自定义控件的私有成员赋值。但是,如果自定义控件又包含自定义控件,某个参数需要以引用的方式一层层传递下去,某些singal还会引起自定义控件重新初始化,以及关闭对话框需要保存参数,在这种情况下,如果每个控件都用一大堆get和set去设置,逻辑就会变复杂。我在把一个项目移植到qt上,这个项目的各个控件都很独立,耦合性低,如果在qt里改变条理,代码阅读起来就会很困难,也容易出错。

#13


引用 12 楼 rm_ryt 的回复:
引用 11 楼 livealearn 的回复:
ui_mainDialog.h是自动生成的,里面带有setupUi函数,我大概明白楼主的意思了,是在一个窗体中的某个控件在setupUI里面被自动创建了。
其实我觉得楼主完全可以换个思路,不要把代码全写在widget的构造函数内,把需要执行的代码,安排在父窗口的ui->setupUI()之后执行就可以了吧?


袍哥,你终于明白我的意思了……


那就不要用UIC了吧,自己写个配置文件,将控件的边界以及一些属性以相对值的方式存进去,运行的时候实时计算,类似SVG这种矢量图文件,我一直是这么干的。

#14


重写setupUi函数

#15


楼主知音啊~   表示遇上同样的问题了~  看来也只能换个思路或者重写一下setupUi了。
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告