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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы отрисовки плагина на родительском виджете в режиме Qt designer  (Прочитано 3373 раз)
dresha48
Гость
« : Январь 11, 2010, 17:14 »

Необходимо было отрисовать часть плагина(крестик со строкой ) на родительском окне - т.е. за пределами отрисовки плагина. Для этого создал в плагине дружественный класс для которого переопределил отрисовку.
Это в конструкторе плагина:
Код
C++ (Qt)
mAim=new HmiAim(this->parentWidget());
Вот что в самой отрисовке (хотя это вряд ли имеет значение):
Код
C++ (Qt)
void
HmiAim::paintEvent(QPaintEvent *event)
{....//select penColor
QPainter *painter=new QPainter(this);
// draw claw
QPen *pen=new QPen;
pen->setColor(penColor);
pen->setWidth(2);
painter->setPen(*pen);
painter->drawLine(0,15,30, 15);
painter->drawLine(15,0, 15, 30);
QFont fontLabel("Arial", 10, QFont::Bold);
painter->setFont(fontLabel);
painter->drawText(30,20,labelText);
delete pen;
delete painter;
}
 
При загрузке плагина программно и в preview дизайнера - всё отрабатывает отлично - нужный объект рисуется и в плагине и за его пределами, но в дизайнере я эту часть плагина ни разу не видел. Поскольку сталкивался уже с несколькими проблемами самого дизайнера при создании плагинов(неправильной отрисовки сложных плагинов при изменении свойств, не правильным отображением контролов при изменении QLaout, не отображением первого ресурса в конструкторе - но это всё мне удалось обойти, а с данной проблемой решения пока не вижу), то возникает вопрос это можно как то обойти, что-то я делаю не так , и действительно ли это проблема дизайнера? Использую QT 4.5.3
Ещё такой момент - когда в тестовом приложении уже созданное ui окно загружаешь с этими плагинами - так этот крестик и в дизайнере отрисовывается(причем если удалить плагин, он останется), а вот если добавишь новый - то крестика уже не будет - это почти меня убедило , что глючит дезайнер.
« Последнее редактирование: Январь 14, 2010, 13:48 от Dendy » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Январь 13, 2010, 22:23 »

Цитировать
на родительском окне - т.е. за пределами отрисовки плагина
а вы уаерены что вообще такое можно делать?
painEvent вызовется для виджета когда Qt решит что его нужно перерисовать - и решит это на сонове QRect этого плагина - и про то что вам надо за его пределами - ей все равно... То что оно вообще где-то рисуется лишь удачное совпадение событий, виджет на котором рисовался плагин отрисовался первым, а потом плагин - вот и не стерлось, попробуйте в тот момент когда у вас якобы "работает" аккуратно перекрыть другим окном часть отрисовки плагина - не перемещая это окно на область самого плагина - уверен 99 % плагин не перерисует эту чать...
ИМХО - надо искать другой подход для достижения вашей цели...
Записан
dresha48
Гость
« Ответ #2 : Январь 14, 2010, 11:28 »

Цитировать
на родительском окне - т.е. за пределами отрисовки плагина
а вы уаерены что вообще такое можно делать?
painEvent вызовется для виджета когда Qt решит что его нужно перерисовать - и решит это на сонове QRect этого плагина - и про то что вам надо за его пределами - ей все равно... То что оно вообще где-то рисуется лишь удачное совпадение событий, виджет на котором рисовался плагин отрисовался первым, а потом плагин - вот и не стерлось, попробуйте в тот момент когда у вас якобы "работает" аккуратно перекрыть другим окном часть отрисовки плагина - не перемещая это окно на область самого плагина - уверен 99 % плагин не перерисует эту чать...
ИМХО - надо искать другой подход для достижения вашей цели...
Только что проверил - всё работает нормально . Да и painEvent должен вызываться когда нужно перерисовать родителя - и так и происходит.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Январь 14, 2010, 13:41 »

Да возможно виджеты-контейнеры отрисовывают все дочерние виджеты при отрисовке себя. Но я как то привык мыслить что виджет должен рисовать только в той области что ему пренадлежит. Кстати а когда вы пробовали перерисовка действительно вызывалась (можно для проверки поставить точку останова или ыввести в консоль), просто некоторые системы наверное могут при наложении окошка на другие элементы копировать область экрана под окошком и потом восстанавливать ее, чтобы не вызывать перерисовку окон. Но может это и не так. Можно попробовать увести область виджета за границу экрана (тогда по идее уж точно перерисовка будет вызываться)... А вообще если не секрет в чем основная задача - почему виджету надо рисовать на чужой области? Может есть более простое решение? (Да и просто интересно)
Записан
dresha48
Гость
« Ответ #4 : Январь 14, 2010, 14:37 »

Точка остановы заходит норм - в отладке всё отлично работает.
Задача иметь кастом-виджеты со свойствами и стилями, которые можно расположить дизайнером-QT. Рисовать за пределами себя......ну как бы в этом плагине ничто не предвещало беды ,кроме этой как бы мелочи которую придумали в самом конце — и по другому уже никак не хотят. А сперва мы сомневались ваще возможно ли такое . В принципе всё уже подходит — только если проблема таки в дизайнере — мне надо это обосновать и заказчик будет доволен.
для более полной картины приложил исходники.
Записан
dresha48
Гость
« Ответ #5 : Январь 14, 2010, 14:38 »

И хидер тут
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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