2

我制作了一个自定义的 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");

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

问题

所以我的问题有两个:在包含 QtDesigner 插件时如何设置子小部件的属性,以及这个"__qt__passive_..."字符串有什么魔力?

编辑: multipagewidget 示例也无法保存从组合框更改时 currentIndex 更改的事实。

所以现在我将使用 Q_PROPERTY 路线,就像@ratchet 怪胎的评论所建议的那样

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

4

1 回答 1

1

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

  1. 使用 Q_PROPERTY 为 QWidget 中的子小部件创建 setter 和 getter 包装器
  2. 将此行添加到插件小部件(分别为 textEdit 的“__qt__passive_textEdit”),然后 QtDesigner 允许单击组合框并更改所选值。此处描述了此行为。
  3. 在属性编辑器中更改属性并通过以下代码将其标记为已更改,您可以将其添加到组合框索引更改槽或处理程序中:

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初始化为QDesignerPropertySheetExtension *mSheet = 0;.

与第 2 步不同,第 3 步在Qt Doc中有详细记录。即使有例子

于 2016-04-24T02:01:59.030 回答