从qt设计器访问自定义qt设计器插件子窗口小部件

时间:2013-09-16 14:37:36

标签: c++ qt qt-designer custom-widgets

我制作了一个自定义的QtDesigner插件。它在QtDesigner中很好地加载,我可以在.ui文件中使用它,它在可执行文件中工作正常。

我唯一担心的是,当在另一个小部件中使用插件时,我无法更改插件的子小部件的值。

对不起,如果这令人困惑,这是一个情况的示意图:

MyDesignerPlugin -> QWidget -> QComboBox
                            -> QTextEdit

在QtDesigner中:

MainWindow -> MyDesignerPlugin

而且我无法访问底层的QComboBox和QTextEdit。 好吧,我找到了两种方法。第一个效果很好,但非常麻烦。第二个几乎可以工作。

第一个解决方案 - 工作

首先,我可以在QWidget中为子窗口小部件创建setter和getter,并且由于Q_PROPERTY魔术,这些属性出现在QtDesigner的属性编辑器中。

这很好,但不是我想要的。我希望能够点击QTextEdit并直接从那里编辑文本。默认情况下这是不可能的。

第二种解决方案 - 不工作

我查看了示例https://qt-project.org/doc/qt-5.0/qtdesigner/containerextension.html#multipagewidget-class-definition并偶然发现multipagewidget.cpp中的这一行:

comboBox->setObjectName("__qt__passive_comboBox");

如果我将此行添加到我的插件小部件(分别为textEdit的"__qt__passive_textEdit"),则QtDesigner允许我单击组合框并更改所选值。 但是当我关闭QtDesigner并重新打开它时,不会保存动作(更改comboBox中的选定项目)。

问题

所以我的问题是双重的:如何在包含QtDesigner插件时设置子窗口小部件的属性以及这个"__qt__passive_..."字符串有什么神奇之处?

修改 multipagewidget示例不管理从comboBox更改时保存currentIndex的事实。

所以现在我会选择Q_PROPERTY路线,就像@ratchet freak的评论所暗示的那样

如果有人想知道如何保存更改,只需在QtDesigner中,属性名称在属性编辑器中变为粗体。

1 个答案:

答案 0 :(得分:1)

是的,您可以:完整的解决方案是您的第1和第2步以及第3步的组合:

  1. 使用Q_PROPERTY为QWidget中的子窗口小部件创建setter和getters包装器
  2. 将此行添加到插件小部件(分别为textEdit的“__qt__passive_textEdit”),然后QtDesigner允许单击组合框并更改所选值。此行为描述为here
  3. 在属性编辑器中更改属性,并通过以下代码将其标记为已更改,您可以将其添加到组合框索引更改槽或处理程序:
  4. function testThis() { var makeYear = Xrm.Page.getAttribute("new_makeyear"); if (!makeYear) { return; } console.log(makeYear.getOptions().length + " options currently available"); }

    ,其中

    changeQtDesignerProperty("currentIndex", index);

    与其他属性需要做同样的事情。需要在 void MyPlugin::changeQtDesignerProperty(QString propertyName, QVariant value) { #if defined(QT_PLUGIN) QDesignerFormWindowInterface *form = QDesignerFormWindowInterface::findFormWindow(this); if(form) { if(!mSheet) // Need to create sheet only once { QDesignerFormEditorInterface *editor = form->core(); QExtensionManager *manager = editor->extensionManager(); mSheet = qt_extension(manager, this); } // Set property in Qt Designer int propertyIndex = mSheet->indexOf(propertyName); mSheet->setProperty(propertyIndex, value); mSheet->setChanged(propertyIndex, true); } #endif }析构函数中delete mSheet;MyPlugin已初始化为mSheet

    与第2步不同,第3步已在Qt Doc中详细记录。即使使用examples