Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QScrollArea paintEvent, Ругается на переопределение 
V
    Опции темы
null56
Дата 6.1.2009, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Тема обсуждалась чуть ранее, но я так и не понял, в чем проблема?

Есть класс наследник от QScrollArea, у него переопределено событие eventPaint

Код

void ScrollCanvas :: paintEvent(QPaintEvent *event)
{
    qDebug("PREVED");
    QPainter p(this);
    p.setRenderHint(QPainter::Antialiasing, true);
    p.setPen(QPen(Qt::gray, 1, Qt::SolidLine));
    p.setBrush(Qt :: blue);
    QRect rect(50, 50, 40, 60);
    p.drawRect(rect);
}


Вывод в консоль при каждой отрисовке:
Код

PREVED
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setRenderHint: Painter must be active to set rendering hints


Нельзя что ли на нем рисовать? ничего не рисуется на виджете, хотя этот фокус проходит на аналогичном примере QMainWindow
PM MAIL   Вверх
null56
Дата 6.1.2009, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Вот решение... но зачем вызывать базовый обработчик?
Код

void myScrollArea::paintEvent(QPaintEvent* event)
{
    QScrollArea::paintEvent(event);
    QPainter painter(viewport());

    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
    painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
    painter.drawEllipse(80,80,200,240);

}


PM MAIL   Вверх
SABROG
Дата 6.1.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Ты не можешь рисовать на чужих окнах в paintEvent'e какого-нибудь окна. viewport() - не является одним из родителей QScrollArea, это окно вручную устанавливается через передачу указателя (setViewport()). Переопредели painEvent в классе viewport'a.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
null56
Дата 6.1.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Способ выше работает... виджет уже имеет видимо свой вьюпорт.... на чем - то он должен же рисовать
PM MAIL   Вверх
SABROG
Дата 6.1.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(null56 @ 6.1.2009,  17:26)
Способ выше работает... виджет уже имеет видимо свой вьюпорт.... на чем - то он должен же рисовать

Он работает только потому, что ты вызываешь оригинальный обработчик, который в свою очередь вызывает обработчик paintEvent дочерних виджетов - viewport'a. В итоге если ты не рисуешь на родительском окне, то дочерние тоже не перерисуются.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
null56
Дата 6.1.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Ну в приципе это логично, тогда какой смысл переопределять событие дочернего виджета...
Это нужно самому компонент создавать, там переопределять, потом делать setViewport...? тогда и будет работать непосредственно....
PM MAIL   Вверх
SABROG
Дата 6.1.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(null56 @  6.1.2009,  18:02 Найти цитируемый пост)
Это нужно самому компонент создавать, там переопределять, потом делать setViewport...? тогда и будет работать непосредственно.... 


Да, иначе это чревато тем, что переопределенный paintEvent главного окна тупо отресует твою картинку поверх нарисованного без учета перекрытия окон.

user posted image


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0620 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.