[英]How to promote a custom widget in QT Creator
在qt 5.2.1中,我创建了一些自定义小部件,比如按钮。 传统上有两种方法可以做到这一点。 您可以升级现有小部件。 并更改/添加功能。 或者从头开始创建自定义小部件。 我用过后者。
但是,在某些情况下,我想使用我的自定义小部件,但通过推广更改其中的一些功能。 通常的方法是添加一个小部件,然后进行推广。 但是,在创建新类型的提升窗口小部件时,必须选择基类。 在可以执行此操作的对话框中,仅列出默认小部件。
是否可以将自定义小部件添加到此列表中?
问候,
Lauris
编辑:
我玩过很多次。 现在突然间,一个自定义小部件被添加到基类列表中。 但我仍然不知道我是如何添加它的。 为什么这是列表中唯一显示的自定义小部件。
假设我们需要创建自定义按钮类,例如MyButton
。 它继承了QPushButton
,重新实现了它的一些方法并添加了新的方法。 现在我们需要将它添加到Qt Designer表单中。 我们在表单中添加了一个按钮,并将其提升为MyButton
类。 这个动作意味着什么?
MyButton*
类型的成员。 您可以使用ui->myButton
(如果您这样命名)来访问该对象并使用其所有方法。 当然,所有QPushButton
的方法也都可用,因为这就是C ++继承的含义。 MyButton
继承QPushButton
并允许您编辑其特定属性(例如checkable
)并访问其插槽(例如, clicked
)。 现在我们想针对某些特殊情况扩展MyButton
功能。 我们创建了一个名为MySpecialButton
的类,该类派生自MyButton
并略微改变其行为。 我们如何将其添加到表单中? 就像上面那个。 我们在表单中添加一个按钮,并将其提升为MySpecialButton
类。 Qt Designer并不关心QPushButton
是MySpecialButton
的直接基础还是有很长的继承链。 它仍然允许编辑特定于按钮的属性,并且您仍然可以通过ui
变量完全访问MySpecialButton
方法。
QPushButton
只是一个例子。 即使您在表单中将QWidget
提升为MySpecialButton
,上述所有内容都将成立。 它唯一的区别是Qt Designer不允许编辑QPushButton
属性并访问它的插槽,限制你使用QWidget
的属性。 另一方面,您不需要从QPushButton
派生MyButton
。 您可以选择QWidget
或其任何子类作为基础。 选择具有最接近功能的类是合理的,因此您需要实现更少的功能。 在推广之前选择最直接的基类是合理的,因为您将能够访问更多属性。 这只是方便的问题。 (但是当然如果你为促销选择了错误的基类,它将无法工作。)
这似乎是Qt Creator中的一个错误。 一种解决方法,奇怪的是将小部件两次添加到小部件库导出的小部件列表中:
IOSwidgets::IOSwidgets(QObject *parent)
: QObject(parent)
{
m_widgets.append(new aircraftAttitudePlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new alfabeticKeypadPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new arrowedFramePlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new buttonWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new dataButtonPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new frameWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new headingDialPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new imageWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new labelWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new linkedButtonWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new linkedLabelWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new linkedSliderWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new NavButtonPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new numericKeypadPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new repositionWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new runwayInformationPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new slewWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new sliderWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new WeightBalancePlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new WindshearMicroburstLateralPlugin(this));
m_widgets.append(m_widgets.last());
}
希望这可以节省下一个遇到这个问题的人,我付出了艰苦的努力和花费了大量的时间来找到这个问题:)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.