Qt Widget 插件在 Designer 中无输出

Qt Widget Plugin No Output in Designer

我有一组自定义小部件正在 Qt 设计器中实现。我已经成功构建了插件,并且已经输出了 .lib.dll 文件。我在 Qt Designer 中成功地看到了所有小部件的列表。但是,当我将一个小部件拖到场景中时,什么也没有。现场什么都没有,光标里什么也没有,就是什么都没有。我将提供我的一个小部件及其相应插件的相关代码。非常感谢任何help/comment关于此事的意见。

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

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

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

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

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

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

然后我用你原来的 QtMaterialBadge class 替换回 "renamed copy of Qt's AnalogClock" 并且,新的惊喜......拖放仍然在 Qt Designer 中工作。结论:你的QtMaterialBadgePlugin肯定有问题!

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

只需替换:

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 的预览),您可能更喜欢在此处预览您的小部件,我会让你解决这个问题。考虑到您的问题“但是,当我将一个小部件拖到场景中时,我想我的回答已经足够了。场景中没有任何东西,光标中没有任何东西,根本没有任何东西” : 现在你得到了一些东西!