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