以前从未使用过 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 的预览),您可能更喜欢在这里预览您的小部件,我会让您解决这个问题. 考虑到您的问题,我想我的回答就足够了“但是,当我将小部件拖动到场景中时,什么都没有。场景中什么都没有,光标中什么都没有,什么都没有”:现在您得到了一些东西!