• 9123阅读
  • 19回复

[提问]怎样克隆控件?(已解决) [复制链接]

上一主题 下一主题
离线liuxu_lx7
 
只看楼主 倒序阅读 楼主  发表于: 2011-05-03
目地:我在UI Designer中创建了一个 PushButton 和一个 GroupBox。想动态的克隆这2种控件。
是否有这样的函数:cloneWidget(/*控件实例*/) 可以克隆出完全一样的一个控件。

我查看助手没有找到。感谢解答和提供信息的朋友^_^
[ 此帖被liuxu_lx7在2011-05-03 20:59重新编辑 ]
离线浪漫天使
只看该作者 1楼 发表于: 2011-05-03
工厂模式。
离线duduqq

只看该作者 2楼 发表于: 2011-05-03
自己写个cloneWidget函数了
离线liuxu_lx7
只看该作者 3楼 发表于: 2011-05-03
我是想到自己可以写,不过QT是否本身就具备这个功能呢?
离线downstairs

只看该作者 4楼 发表于: 2011-05-03
没有
喜爱编程的猫头鹰
离线liuxu_lx7
只看该作者 5楼 发表于: 2011-05-03
确实翻遍了中英文网页,也没发现有这个现成的函数。 不过在一个英文网页上找到了用【动态加载*.ui】的方式,可以解决。 我也尝试过了。大致思路是:使用QUiLoader和它的Load函数,重复创建widget。我简单写了个流程,解决了我目前的问题:http://liuxuvslisa.blog.sohu.com/171953744.html
我觉得可能存在的缺点:加载控件慢。能慢到什么程度不知如何衡量:(

如果这方法有什么错误(或缺点),或有更好的方法,请告知我,谢谢^_^
[ 此帖被liuxu_lx7在2011-05-03 20:59重新编辑 ]
离线dbzhang800

只看该作者 6楼 发表于: 2011-05-03
引用第5楼liuxu_lx7于2011-05-03 20:58发表的  :
确实翻遍了中英文网页,也没发现有这个现成的函数。 不过在一个英文网页上找到了用【动态加载*.ui】的方式,可以解决。 我也尝试过了。大致思路是:使用QUiLoader和它的Load函数,重复创建widget。我简单写了个流程,解决了我目前的问题:http://liuxuvslisa.blog.sohu.com/171953744.html
我觉得可能存在的缺点:加载控件慢。能慢到什么程度不知如何衡量:(
如果这方法有什么错误(或缺点),或有更好的方法,请告知我,谢谢^_^

呵呵,没太搞清楚你要解决的究竟是个什么问题。感觉上你直接写个类,然后按照需求 new 若干个出来不就行了?

另外:冒号开头路径属于Qt的资源系统。Qt的扩展体现在:moc、uic、rcc
离线liuxu_lx7
只看该作者 7楼 发表于: 2011-05-05
引用第6楼dbzhang800于2011-05-03 21:32发表的  :
呵呵,没太搞清楚你要解决的究竟是个什么问题。感觉上你直接写个类,然后按照需求 new 若干个出来不就行了?



目地:在UI Designer中编辑一个复杂的UI界面,并在应用程序中“克隆”几个完全一样的界面。

您说的new出若干个,我本来以为是这样,可控件不支持“拷贝构造”,没法完全“克隆”一个一模一样的。
离线roywillow

只看该作者 8楼 发表于: 2011-05-05
不是很清楚这个“一模一样”到什么程度
比如说,是要到跟当前窗口,包括其中各种状态(比如文本框中有东西,某个东西被选中)一模一样的窗口呢,还是说只要能显示出来一个构造和功能一样的窗口,但其中的一些状态则是完全初始化的?
对于后者,本身ui设计出来的窗口要成为一个独立的类的,实例化这个类自然也就出来一模一样的窗口了
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 9楼 发表于: 2011-05-05
呵呵,是啊,本来我还不太确信(怕你需要的是动态特性 uiload配合script),现在看来,既然你认为uiload可以满足你的要求,那么new 应该完全可以实现你的要求
离线liuxu_lx7
只看该作者 10楼 发表于: 2011-05-05
回 8楼(roywillow) 的帖子
想要前者,有什么办法么?
离线liuxu_lx7
只看该作者 11楼 发表于: 2011-05-05
回 9楼(dbzhang800) 的帖子
您说的new可以解决,是怎么个写法呢?我还迷惑在“没有拷贝构造函数”的情况中。
离线dbzhang800

只看该作者 12楼 发表于: 2011-05-05
Re:回 9楼(dbzhang800) 的帖子
引用第11楼liuxu_lx7于2011-05-05 21:53发表的 回 9楼(dbzhang800) 的帖子 :
您说的new可以解决,是怎么个写法呢?我还迷惑在“没有拷贝构造函数”的情况中。


这个拷贝构造函数没什么关系吧。

比如你连续两个 new QPushButton(); 不就“一样”的两个按钮么?
离线roywillow

只看该作者 13楼 发表于: 2011-05-06
Re:回 8楼(roywillow) 的帖子
引用第10楼liuxu_lx7于2011-05-05 21:52发表的 回 8楼(roywillow) 的帖子 :
想要前者,有什么办法么?


也就是说你需要把某个窗口的所有状态都一模一样的复制出来?
我感觉除了自己逐个记录下来那些可能会变化的状态然后应用到新窗口上之外,没什么好办法了吧……QWidget好像没有拷贝构造函数……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线liuxu_lx7
只看该作者 14楼 发表于: 2011-05-06
Re:Re:回 9楼(dbzhang800) 的帖子
引用第12楼dbzhang800于2011-05-05 21:59发表的 Re:回 9楼(dbzhang800) 的帖子 :
这个拷贝构造函数没什么关系吧。
比如你连续两个 new QPushButton(); 不就“一样”的两个按钮么?
.......


但是这2个button都是系统默认的样子。说个最简单的,如果我创建了一个写着"hehe"的QPushButton,我想克隆它,新的QPushButton也应该显示"hehe"字样。
离线liuxu_lx7
只看该作者 15楼 发表于: 2011-05-06
Re:Re:回 8楼(roywillow) 的帖子
引用第13楼roywillow于2011-05-06 10:14发表的 Re:回 8楼(roywillow) 的帖子 :
也就是说你需要把某个窗口的所有状态都一模一样的复制出来?
我感觉除了自己逐个记录下来那些可能会变化的状态然后应用到新窗口上之外,没什么好办法了吧……QWidget好像没有拷贝构造函数……


我也没找到这样的“现成”功能。暂时的做法是多次加载了*.ui,这样倒是可以达到“克隆”目地。
离线dbzhang800

只看该作者 16楼 发表于: 2011-05-06
Re:Re:Re:回 9楼(dbzhang800) 的帖子
引用第14楼liuxu_lx7于2011-05-06 10:43发表的 Re:Re:回 9楼(dbzhang800) 的帖子 :
但是这2个button都是系统默认的样子。说个最简单的,如果我创建了一个写着"hehe"的QPushButton,我想克隆它,新的QPushButton也应该显示"hehe"字样。

这个要求用new完全没什么问题。
离线liuxu_lx7
只看该作者 17楼 发表于: 2011-05-10
回 16楼(dbzhang800) 的帖子

这个是QT助手截图

只有这3种new的方式。
我想要的是:对一个已知QPushButton,但是不提供它文字、图标信息,就可以自动“克隆”出这些信息。

如果没有“克隆”接口,我就必须一一取出文字、图标,然后手动赋值。
对于QPushButton这样的简单控件来说,还算简单。对于复杂控件,比如Tree,也要一一遍历就很麻烦。
而且,我还需要用到多态,对所有的Widget无差别的进行复制(克隆)。

感谢您百忙之中的热心解答,我经验尚浅有些表达可能不太准确,请您包涵^_^
离线dbzhang800

只看该作者 18楼 发表于: 2011-05-10
Re:回 16楼(dbzhang800) 的帖子
引用第17楼liuxu_lx7于2011-05-10 14:45发表的 回 16楼(dbzhang800) 的帖子 :
[图片]
这个是QT助手截图
只有这3种new的方式。
我想要的是:对一个已知QPushButton,但是不提供它文字、图标信息,就可以自动“克隆”出这些信息。
.......

1. 你这儿不存在“克隆”一说。无论是你通过uiloader来间接用new,还是直接用new。

2. 这也不是new的3中形式,只是说QPushButton有3个重载的构造函数。

3. 你需要不就是定义一个类,然后创建该类的对象么?(可能连new都不需要)
离线liuxu_lx7
只看该作者 19楼 发表于: 2011-05-10
回 18楼(dbzhang800) 的帖子
才注意到:*.ui文件中的控件在GeneratedFiles目录下生成了 ui_*.h文件。而且所有UI Designer中的控件建立信息都已在此转化为代码。所以直接实例化 ui_*.h中的类就可以了。

附:楼上几位朋友的意思我又没理解对,一直以为在说 new QPushButton(QListWidget) 这些QT的内置控件类型。

谢谢谢谢^_^
快速回复
限100 字节
 
上一个 下一个