-4

我有一组要在 Qt Designer 中实现的自定义小部件。我已经成功构建了插件,并且已经输出.lib了文件和.dll文件。我成功地在 Qt Designer 中看到了我的所有小部件的列表。但是,当我将一个小部件拖到场景中时,什么也没有。现场什么都没有,光标什么也没有,什么都没有。我将提供我的一个小部件及其相应插件的相关代码。非常感谢您对此事的任何帮助/评论。

编辑:我被告知要为我的项目创建一个 MCVE,以使其易于编译和调试。所以我有。https://github.com/NickJohn547745/MaterialWidget-MCVE

4

1 回答 1

2

以前从未使用过 Qt Designer 插件,但这看起来很有趣。

这是我为解决您的问题所做的工作。我只是在这里详细说明方法,以便您可以理解它并可能以后自己应用它(该方法可能适用于您可能遇到的其他类型的问题)。

由于我对 Qt Designer 插件不熟悉,所以我将Qt 示例用于 Designer 插件并使其在我的计算机上运行(很容易做到,只需编译,将生成的 .so 复制到 QtDesigner 插件的文件夹中)。

然后,我从 github 获取了您的示例,对其进行了编译并检查了拖放是否如您所报告的那样不起作用。

然后,我将您QtMaterialBadgePlugin的替换为 Qt 的重命名副本,AnalogClockPlugin并将您QtMaterialBadge的替换为 Qt 的重命名副本AnalogClock。然后我编译了插件,而且,惊喜....我可以拖放插件项目,它工作!所以你的代码肯定有问题。

AnalogClock然后我用你原来的类替换了“Qt 的重命名副本” QtMaterialBadge,新的惊喜......拖放在 Qt Designer 中仍然有效。结论:你的肯定有问题QtMaterialBadgePlugin

QtMaterialBadgePlugin所以我检查了你的班级和Qt的班级之间的差异AnalogClockPlugin。这很简单,因为只有几行代码......

只需更换:

QString QtMaterialBadgePlugin::domXml() const
{
    return QLatin1String("<widget class=\"QtMaterialBadge\" name=\"qtMaterialBadge\">\n<widget>\n");
}

经过:

QString QtMaterialBadgePlugin::domXml() const
{
    return "<ui language=\"c++\">\n"
               " <widget class=\"QtMaterialBadge\" name=\"qtMaterialBadge\">\n"
               "  <property name=\"geometry\">\n"
               "   <rect>\n"
               "    <x>0</x>\n"
               "    <y>0</y>\n"
               "    <width>100</width>\n"
               "    <height>100</height>\n"
               "   </rect>\n"
               "  </property>\n"
               " </widget>\n"
               "</ui>\n";
}

现在您的插件将可以从 Qt Designer 中拖放。请注意,您忘记了:

  • 顶层的“ui” XML 节点,但这显然是可选的,因为即使没有它,插件也可以工作
  • 几何属性(用于确定拖放期间使用的默认大小)。那是你问题的根本原因!

现在,您将看到拖放只显示一个灰色方形区域(而 Qt 示例显示了 AnalogClock 的预览),您可能更喜欢在这里预览您的小部件,我会让您解决这个问题. 考虑到您的问题,我想我的回答就足够了“但是,当我将小部件拖动到场景中时,什么都没有。场景中什么都没有,光标中什么都没有,什么都没有”:现在您得到了一些东西!

于 2018-03-07T20:07:17.200 回答