我制作了一个自定义的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中,属性名称在属性编辑器中变为粗体。
答案 0 :(得分:1)
是的,您可以:完整的解决方案是您的第1和第2步以及第3步的组合:
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
。