【问题标题】:How to promote a custom widget in QT Creator如何在 QT Creator 中推广自定义小部件
【发布时间】:2014-10-30 07:22:52
【问题描述】:

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

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

是否可以在此列表中添加自定义小部件?

问候,

劳里斯

编辑:

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

【问题讨论】:

  • 您好,使用 Qt Creator,并不是因为只有基类显示并且可以选择,所以您无法编写自己的自定义类。
  • Promoting 只是在 Qt Designer 中添加和显示自定义小部件的一种简单方法。它与功能无关。
  • @Ezee Promoting 是一种基于现有小部件(基类)添加自定义小部件的方法。我希望这个小部件成为我自己定义的小部件。而不是像 QButton 或 QSlider 这样的现有小部件。
  • @Martin QT 是开源的,因此应该可以通过更改源代码来编辑此列表中显示的内容。但是,我认为这不是必需的。因为当我构建自己的 qt 创建器时,我创建的一些小部件会添加到此列表中。但是,有些不是。我没有看到添加小部件和不添加小部件的逻辑。
  • 我不知道该怎么做你想要的,但我也不确定你的情况是否真的有必要。使用自定义小部件时,通过源代码非常简单。你不知道怎么做还是真的有必要推广它?

标签: c++ qt widget


【解决方案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());
}

希望这可以节省下一个遇到此问题的人,以及我发现此问题所花费的艰苦努力和大量时间:)。

【讨论】:

  • 我有同样的问题,但我不明白你到底做了什么。你能告诉我更多细节吗?
  • 已经有一段时间了:),但没有什么比我在这里说的更重要的了。为了显示小部件,您需要将它两次添加到 qtcreator 正在加载的小部件列表中。他们现在可能已经修复了这个错误
  • 感谢您的及时回复。实际上,我正在 Windows 上使用 Qt Creator,我的具体问题是我可以在哪里修改您提到的列表?
  • 我记得,为了添加你自己的小部件,你需要自己编译 Qt creator。在 Qt 创建者的代码中某处正在加载小部件,您可以在那里添加自己的列表。
  • 好的,我使用了 Qt Design Custom Widget 模块来做到这一点,所以我没有从头开始编译 At creator。
【解决方案2】:

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

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

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

QPushButton 只是一个例子。即使您在表单中将QWidget 升级为MySpecialButton,以上所有内容都将成立。唯一不同的是,Qt Designer 将不允许编辑QPushButton 属性和访问其插槽,从而将您限制为QWidget 的属性。另一方面,您不需要从QPushButton 派生MyButton。您可以选择QWidget 或其任何子类作为基础。选择功能最接近的类是合理的,这样你就需要实现更少的东西。并且在提升之前选择最直接的基类是合理的,因为您将能够访问更多属性。这只是方便的问题。 (当然,如果你选择了错误的基类进行提升,它是行不通的。)

【讨论】:

  • 您好帕维尔,谢谢您的回答。它为促销和促销继承的工作原理提供了一些非常好的启示。但是就我而言,我不想使用继承。但我想推广一个自定义小部件,我已添加到 QT creator。你碰巧知道它是如何工作的吗?
  • 没有任何继承就不可能有小部件。他们必须以某种方式继承QWidget。如果您有一个直接继承QWidget 的自定义小部件,您可以在表单中添加一个小部件,并像往常一样将其提升为自定义小部件。
  • 我的自定义小部件继承自 qwidget。但不是使用促销,我创建了一个小部件插件,如link 示例所示。这样我还添加了属性和类似的东西。但是,如果我要推广 QWidget,这些属性将无法访问。假设我已将自定义小部件命名为 MySpecialButton,我想推广此小部件。
  • 感谢@Pavel,这非常清楚地解释了促销活动。 Relevant Qt documentation here.
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2012-08-06
相关资源
最近更新 更多