在qt 5.2.1中,我创建了一些自定义小部件,比如按钮。传统上有两种方法可以做到这一点。您可以升级现有小部件。并更改/添加功能。或者从头开始创建自定义小部件。我用过后者。
但是,在某些情况下,我想使用我的自定义小部件,但通过推广更改其部分功能。通常的方法是添加一个小部件,然后进行推广。但是,在创建新类型的提升窗口小部件时,必须选择基类。在可以执行此操作的对话框中,仅列出默认小部件。
是否可以将自定义窗口小部件添加到此列表中?
此致
Lauris
编辑:
我玩过很多次。现在突然间,一个自定义小部件被添加到基类列表中。但我仍然不知道我是如何添加它的。为什么这是列表中唯一显示的自定义小部件。
答案 0 :(得分:2)
我们需要创建自定义按钮类,例如MyButton
。它继承了QPushButton
,重新实现了它的一些方法并添加了新的方法。现在我们需要将它添加到Qt Designer表单中。我们在表单中添加了一个按钮,并将其提升为MyButton
类。这个动作意味着什么?
MyButton*
类型的成员。您可以使用ui->myButton
(如果您这样命名)来访问该对象并使用其所有方法。当然,所有QPushButton
的方法也都可用,因为这是C ++继承的含义。MyButton
继承QPushButton
并允许您编辑其特定属性(例如checkable
)并访问其广告位(例如clicked
)。现在我们想针对某些特殊情况扩展MyButton
功能。我们创建了一个名为MySpecialButton
的类,该类派生自MyButton
并略微改变其行为。我们如何将其添加到表单中?就像上面那个。我们在表单中添加了一个按钮,并将其提升为MySpecialButton
类。如果QPushButton
是MySpecialButton
的直接基础或存在长链继承,Qt Designer并不在乎。它仍然允许编辑特定于按钮的属性,您仍然可以通过MySpecialButton
变量完全访问ui
方法。
QPushButton
只是一个例子。即使您在表单中宣传QWidget
到MySpecialButton
,上述所有内容都将成立。它唯一的区别是Qt Designer不允许编辑QPushButton
属性并访问其插槽,从而限制了QWidget
的属性。另一方面,您无需从MyButton
派生QPushButton
。您可以选择QWidget
或其任何子类作为基础。选择具有最接近功能的类是合理的,这样您就需要实现更少的功能。在推广之前选择最直接的基类是合理的,因为您将能够访问更多属性。这只是方便的问题。 (但是当然如果你选择错误的基类进行推广,它就不会起作用。)
答案 1 :(得分:1)
这似乎是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());
}
希望这可以节省下一个遇到这个问题的人,我付出了艰苦的努力和花费大量时间来解决这个问题:)。