Я сделал собственный плагин QtDesigner. Он хорошо загружается в QtDesigner, я могу использовать его в файле .ui, и он прекрасно работает в исполняемом файле.
Меня беспокоит только то, что при использовании плагина в другом виджете я не могу изменить значения дочерних виджетов плагина.
Извините, если это сбивает с толку, вот схема ситуации:
MyDesignerPlugin -> QWidget -> QComboBox
-> QTextEdit
В QtDesigner:
MainWindow -> MyDesignerPlugin
И там у меня нет доступа к базовым QComboBox и QTextEdit.
Ну, я нашел два пути. Первый работает хорошо, но довольно громоздко. Второй почти работает.
Во-первых, я могу создавать сеттеры и геттеры для дочерних виджетов в QWidget, и, благодаря магии 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 изменяется при переходе из comboBox.
Так что сейчас я пойду с маршрутом Q_PROPERTY, как предложено в комментарии @ratchet freak
Если кому-то интересно, как можно увидеть, будут ли сохранены изменения, просто в QtDesigner имя свойства становится жирным в редакторе свойств.
Да, Вы можете: полное решение — это комбинация Вашего 1-го и 2-го и 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. Даже с Примеры.
Других решений пока нет …