Доступ к дочернему виджету пользовательского плагина qtdesigner из qtdisgner

Я сделал собственный плагин 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 имя свойства становится жирным в редакторе свойств.

2

Решение

Да, Вы можете: полное решение — это комбинация Вашего 1-го и 2-го и 3-го шага:

  1. Создание сеттеров и оболочек геттеров для дочерних виджетов в QWidget с использованием Q_PROPERTY
  2. Добавьте эту строку в виджет плагина (соответственно «__qt__passive_textEdit» для textEdit), затем QtDesigner позволяет щелкнуть на поле со списком и изменить выбранное значение. Такое поведение описано Вот.
  3. Измените свойство в редакторе свойств и пометьте его как измененный с помощью следующего кода, который вы можете добавить в слот изменения индекса combobox или обработчик:

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. Даже с Примеры.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector