Название: Помогите с пользовательским виджетом. Отправлено: 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() Код
Название: 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, а класса-наследника |