crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Custom Widget не виден на форме, как правильно написать paintEvent и sizeHint
zamnach
  опции профиля:
сообщение 6.8.2008, 16:31
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 18.7.2008
Пользователь №: 239

Спасибо сказали: 0 раз(а)




Репутация:   0  


пытаюсь сделать плагин, наследуя QLineEdit.
мой Edit отличается от QLineEdit только наличием свойства AddName (+метод set и приватный член типа QString)
плагин собирается и устанавливается в Дизайнер. на форму кидаю свой Edit - все ОК, задаю св-во AddName.
при предварительном просмотре ничего на форме не видно.
смекаю - надо свой метод написать paintEvent и sizeHint
как вызвать "стандартный" paintEvent и sizeHint, тот который родительский (внешне мой контрол ничем не отличается от родителя)?
мозх плавится((.
Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 6.8.2008, 17:19
Сообщение #2


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Цитата(zamnach @ 6.8.2008, 16:31) *
как вызвать "стандартный" paintEvent и sizeHint, тот который родительский (внешне мой контрол ничем не отличается от родителя)?

QLineEdit::paintEvent();
QLineEdit::sizeHint();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.8.2008, 17:19
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


а зачем paintEvent свой?
можешь код плагина привести?


P.S. Если код длинный, то лучше обернуть в тэг [expand=исходники][/expand]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zamnach
  опции профиля:
сообщение 6.8.2008, 17:51
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 18.7.2008
Пользователь №: 239

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 6.8.2008, 18:19) *
а зачем paintEvent свой?
можешь код плагина привести?
P.S. Если код длинный, то лучше обернуть в тэг [expand=исходники][/expand]

все заработало.
ошибка была в след-м:
код плагина был примерно такой:
QString CamLineEditPlugin::name() const
{
return "CamLineEdit";// было AnotherName
}

QWidget *CamLineEditPlugin::createWidget(QWidget *parent)
{
return new CamLineEdit(parent);
}

я для благозвучности имени, присваиваемому объекту по-умолчанию вместо "CamLineEdit" забил AnotherName.
И как-то игнорировал сообщения от дизайнера при взятии(drag) своего объекта с палитры:
"A class name mismatch occurred when creating a widget using the custom widget factory registered for widgets of class AnotherName. It returned a widget of class CamLineEdit."
а после ваших постов решил перевести на русский сей мессидж. исправил и все заработало.
в связи с этим, новый вопрос:
каким образом для custom widget можно задавать имя объекта по умолчанию, например чтобы при добавлении на форму нового объекта
имя у него было AnotherName_[число]?
и другие какие-нить свойства, унаследованные от родителя?
спасибо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zamnach
  опции профиля:
сообщение 7.8.2008, 17:04
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 18.7.2008
Пользователь №: 239

Спасибо сказали: 0 раз(а)




Репутация:   0  


обнаружилось странное, товарищи!
есть два проекта:
1-й: плагин в котором создается наследник CamLineEdit (QLineEdit + доп. св-во типа QString)
2-й: приложение, динамически загружающее файлы форм (содержащие CamLineEdit)
там в цикле перебираются все контролы, лежащие на форме, приводятся dynamic_cast к типу указателя на CamLineEdit
Поведение 2-го проекта после запуска на исполнение зависит от режима компиляции обоих проектов.
Вариант А. Плагин собирается debug (в designer пишется, что плагин установлен некорректно. однако формы, созданные ранее - нормально открывает и свойства контролов CamLineEdit показывает правильно )
вариант A-1. приложение запускается debug. при выполнении поля CamLineEdit не заполняются.
вариант A-2. приложение запускается release. при выполнении поля CamLineEdit не заполняются. портится heap (при выходе из программы появляются об этом сообщения)

Вариант B. Плагин собирается release (в designer пишется, что плагин нормально установлен)
вариант B-1. приложение запускается в debug. при выполнении поля не заполняются. В окне Output msvc пишется
"QFormBuilder was unable to create a custom widget of the class 'CamLineEdit'; defaulting to base class 'QLineEdit'."
вариант B-2. приложение запускается release. поля заполняются CamLineEdit. портится heap (при выходе из программы появляются об этом сообщения)
===============================
"кто виноват и что делать"
как донести до QFormBuilder (и до QUiLoader) информацию о том как динамически "create a custom widget of the class 'CamLineEdit'"?
спасибо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.8.2008, 17:09
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Есть такое правило, чесно сказать незнаю потрохов его:
Плагины для дизайнера должны быть в релиз версии, чтобы пользоватся в дизайнере и использовать в своем ПО.

Ещё такой момент:
1) в файле проекта указваешь: CONFIG += release
2) собираешь командой make release

и плагин и ПО, тогда при прочих правильностях все должно работать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zamnach
  опции профиля:
сообщение 11.8.2008, 11:54
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 18.7.2008
Пользователь №: 239

Спасибо сказали: 0 раз(а)




Репутация:   0  


все заработало, почему - пока не знаю. но по программерской поговорке менять ниче не буду)).
Еще вопросик возник: как сделать возможным для моего виджета использовать в дополнительных свойствах русские буквы?
Есть property:
Q_PROPERTY(QString euObjectName READ euObjectName WRITE seteuObjectName)
а в редакторе свойств Дизайнера в него можно забивать строки только англ.буквами.
спасибо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zamnach
  опции профиля:
сообщение 28.11.2008, 16:23
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 18.7.2008
Пользователь №: 239

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(zamnach @ 11.8.2008, 11:54) *
Есть property:
Q_PROPERTY(QString euObjectName READ euObjectName WRITE seteuObjectName)
а в редакторе свойств Дизайнера в него можно забивать строки только англ.буквами.
спасибо

отвечу сам себе):
для возможности работы в дизайнере с русскими буквами в свойствах custom widget: надо убрать из имени свойств (при создании виджета) след. четыре буквы "Name", без кавычек.
в это трудно поверить, но запись в проекте
Q_PROPERTY(QString euObject READ euObject WRITE setEuObject)
вместо того что приведено в цитате, решает проблему русских букв в свойствах виджета.
Сувж.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.1.2025, 6:31