Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: jekazz от Января 18, 2010, 12:42



Название: Помогите с пользовательским виджетом.
Отправлено: jekazz от Января 18, 2010, 12:42
Создаю пользовательский виджет из QLabel. Встраиваю его в дизайнер. Проблема в том, что виджет создаётся с параметрами по-умолчанию, а так как это QLabel, то он создаётся с пустым текстом.
1. Хочется, чтобы когда кидаешь виджет на форму, полю text присваивалось какое-нибудь значение по-умолчанию. Если это делать в самом конструкторе виджета, то при изменении его размеров в дизайнере, какое бы ни было выставлено значение поля text в редакторе свойств, оно снова устанавливается в значение, заданное в конструкторе.
2. Плюс хочется чтобы при помещении виджета на форму moc геперировал код varName->setText("Default value"). Сейчас этого не происходит, пока вручную не изменишь поле text в редакторе свойств.
3. Ещё один момент. При помещении виджета на форму дизайнер генерирует ему имя такое же, как имя класса. В результате чего компилятор сразу же матерится. Хотелось бы, чтобы имя переменной как-то задавалось.


Название: Re: Помогите с пользовательским виджетом.
Отправлено: Akaiten от Января 18, 2010, 13:51
См. пример в Qt \examples\designer\customwidgetplugin\
Необходимо переопределить функцию QDesignerCustomWidgetInterface::domXml()

Код
C++ (Qt)
QString MyLabelPlugin::domXml() const
{
   return "<ui language=\"c++\">\n"
          " <widget class=\"MyLabel\" name=\"myLabel\">\n"
          "  <property name=\"text\" >\n"
          "   <string>Default value</string>\n"
          "  </property>\n"
          " </widget>\n"
          "</ui>\n";
}
 


Название: Re: Помогите с пользовательским виджетом.
Отправлено: jekazz от Января 18, 2010, 14:46
Пробовал! Помогает только для установки имени переменной.
А установка поля text ни к чему не приводит. Ни в *.ui файл формы не прописывается, ни отображается в дизайнере.

Меня посетила догадка. Возможно ли, что это происходит из-за того, что дизайнер для установки свойства text использует свойство класса QLabel? То есть вызывается функция QLabel::setText. В моём виджете тоже присутствует эта функция. Но дизайнер о ней не имеет никакого представления, и она никогда не вызывается, так как не виртуальная. Как вариант, можно переопределить свойство text в моём классе-наследнике
Q_PROPERTY(QString text READ text WRITE setText)
Но тогда в редакторе свойств будет видно 2 свойства text. Это не дело. Как сделать так, чтобы при изменении свойства QLabel::text в дизайнере, вызывалась setText моего класса-наследника?
Хотя, с другой стороны, как я полагаю, ведь дизайнер устанавливает свойства через setProperty("text", QVariant("Field value")), то есть для поиска функции-setter-а используется функция metaObject, которая виртуальная и вернёт MetaObject моего класса-наследника, в результате чего будет вызвана setText не QLabel-а, а моего класса. Или не так? А если так, то почему же не работает?


Название: Re: Помогите с пользовательским виджетом.
Отправлено: jekazz от Января 18, 2010, 15:17
Всё, спасибо, господа и госпожи :) Разобрался. Нужно всё-таки было переопределить свойство text:
Q_PROPERTY(QString text READ text WRITE text)
в наследнике. Дизайнер отображает свойство text только один раз. Благодаря переопределению moc добавляет мета информацию о setter-е наследника setText и при установке свойства вызывается setText не QLabel, а класса-наследника