如何在QT Creator中推广自定义小部件

时间:2014-09-05 10:50:41

标签: c++ qt widget

在qt 5.2.1中,我创建了一些自定义小部件,比如按钮。传统上有两种方法可以做到这一点。您可以升级现有小部件。并更改/添加功能。或者从头开始创建自定义小部件。我用过后者。

但是,在某些情况下,我想使用我的自定义小部件,但通过推广更改其部分功能。通常的方法是添加一个小部件,然后进行推广。但是,在创建新类型的提升窗口小部件时,必须选择基类。在可以执行此操作的对话框中,仅列出默认小部件。

是否可以将自定义窗口小部件添加到此列表中?

此致

Lauris

编辑:

我玩过很多次。现在突然间,一个自定义小部件被添加到基类列表中。但我仍然不知道我是如何添加它的。为什么这是列表中唯一显示的自定义小部件。

2 个答案:

答案 0 :(得分:2)

我们需要创建自定义按钮类,例如MyButton。它继承了QPushButton,重新实现了它的一些方法并添加了新的方法。现在我们需要将它添加到Qt Designer表单中。我们在表单中添加了一个按钮,并将其提升为MyButton类。这个动作意味着什么?

  • Qt Designer生成的Ui类将具有MyButton*类型的成员。您可以使用ui->myButton(如果您这样命名)来访问该对象并使用其所有方法。当然,所有QPushButton的方法也都可用,因为这是C ++继承的含义。
  • Qt Designer会知道MyButton继承QPushButton并允许您编辑其特定属性(例如checkable)并访问其广告位(例如clicked)。

现在我们想针对某些特殊情况扩展MyButton功能。我们创建了一个名为MySpecialButton的类,该类派生自MyButton并略微改变其行为。我们如何将其添加到表单中?就像上面那个。我们在表单中添加了一个按钮,并将其提升为MySpecialButton类。如果QPushButtonMySpecialButton的直接基础或存在长链继承,Qt Designer并不在乎。它仍然允许编辑特定于按钮的属性,您仍然可以通过MySpecialButton变量完全访问ui方法。

QPushButton只是一个例子。即使您在表单中宣传QWidgetMySpecialButton,上述所有内容都将成立。它唯一的区别是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());
}

希望这可以节省下一个遇到这个问题的人,我付出了艰苦的努力和花费大量时间来解决这个问题:)。