Russian Qt Forum
Мая 21, 2025, 21:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с пользовательским виджетом.  (Прочитано 2993 раз)
jekazz
Гость
« : Января 18, 2010, 12:42 »

Создаю пользовательский виджет из QLabel. Встраиваю его в дизайнер. Проблема в том, что виджет создаётся с параметрами по-умолчанию, а так как это QLabel, то он создаётся с пустым текстом.
1. Хочется, чтобы когда кидаешь виджет на форму, полю text присваивалось какое-нибудь значение по-умолчанию. Если это делать в самом конструкторе виджета, то при изменении его размеров в дизайнере, какое бы ни было выставлено значение поля text в редакторе свойств, оно снова устанавливается в значение, заданное в конструкторе.
2. Плюс хочется чтобы при помещении виджета на форму moc геперировал код varName->setText("Default value"). Сейчас этого не происходит, пока вручную не изменишь поле text в редакторе свойств.
3. Ещё один момент. При помещении виджета на форму дизайнер генерирует ему имя такое же, как имя класса. В результате чего компилятор сразу же матерится. Хотелось бы, чтобы имя переменной как-то задавалось.
Записан
Akaiten
Гость
« Ответ #1 : Января 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";
}
 
Записан
jekazz
Гость
« Ответ #2 : Января 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-а, а моего класса. Или не так? А если так, то почему же не работает?
« Последнее редактирование: Января 18, 2010, 15:10 от jekazz » Записан
jekazz
Гость
« Ответ #3 : Января 18, 2010, 15:17 »

Всё, спасибо, господа и госпожи Улыбающийся Разобрался. Нужно всё-таки было переопределить свойство text:
Q_PROPERTY(QString text READ text WRITE text)
в наследнике. Дизайнер отображает свойство text только один раз. Благодаря переопределению moc добавляет мета информацию о setter-е наследника setText и при установке свойства вызывается setText не QLabel, а класса-наследника
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 21.