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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QWidget and QPainter  (Прочитано 4463 раз)
carhun
Гость
« : Август 14, 2012, 10:52 »

Добрый день.

Подскажите как у QWidget'a получить его QPainter?

пробую вот так this->painterEngine()->painter() не помогает, постоянно начинает вылетать приложение...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Август 14, 2012, 11:02 »

Получить "правильный" QPainter от QWidget позволительно только в перегруженном QWidget::paintEvent():
Код
C++ (Qt)
QPainter painter( this );
О чём, кстати, с примерами описано в руководстве.
« Последнее редактирование: Август 14, 2012, 11:07 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
carhun
Гость
« Ответ #2 : Август 14, 2012, 11:27 »

Спасибо.

Т.е. если у себя заведу переменную в классе типа QPainter и при вызову QPaintEvent сохраню там себе в эту перменную QPainter, то я с этим QPainter'м вне QPaintEvent не смогу работать?

Или как мне тогда делать если мне нужен этот QPainter? заводить переменную флажок, по к-ой будет определяться нужна ли отрисовака там мне нужной фигурки, и проверять эту переменную в paintEvent'e?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Август 14, 2012, 11:35 »

Т.е. если у себя заведу переменную в классе типа QPainter и при вызову QPaintEvent сохраню там себе в эту перменную QPainter, то я с этим QPainter'м вне QPaintEvent не смогу работать?
По умолчанию нет, не сможешь.

Цитировать
Или как мне тогда делать если мне нужен этот QPainter? заводить переменную флажок, по к-ой будет определяться нужна ли отрисовака там мне нужной фигурки, и проверять эту переменную в paintEvent'e?
Отрисовку делай в paintEvent() с учётом QPaintEvent::rect(). Для вызова отрисовки отдельной части используй
Код
C++ (Qt)
void QWidget::update ( const QRect & rect )
Записан

Qt 5.11/4.8.7 (X11/Win)
carhun
Гость
« Ответ #4 : Август 14, 2012, 12:27 »

что-то все равно не рисует:

Код:
void MyWidget::paintEvent(QPaintEvent *e)
{
    QPainter p;

    p.begin(this);
    p.setPen(Qt::blue);
    p.drawLine(0, 5, 1000, 1000);

    p.end();
}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Август 14, 2012, 12:36 »

Код верный. Ищи причину в другом.
Записан

Qt 5.11/4.8.7 (X11/Win)
carhun
Гость
« Ответ #6 : Август 16, 2012, 12:11 »

Все равно получается, так что если есть какой-то еще виджет, то он перекрывает, то что на нем нарисовано...
Вот пример.
Хочется так что бы линия рисовалась и поверх кнопки...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Август 16, 2012, 12:16 »

А что, кнопка разве не виджет? У неё свой paintEvent() и естественно её отрисовка будет поверх родительского виджета.
Это же очевидно Непонимающий
Ты бы лучше описал, что хочешь получить на выходе, а не боролся с тем, в чём мало разбираешься.
« Последнее редактирование: Август 16, 2012, 12:18 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
carhun
Гость
« Ответ #8 : Август 16, 2012, 12:39 »

Та получается мне нужен заводить еще одни виджет, к-ый будет рисовать поверх...

Я хочу получить такое:
Есть у меня виджет, на к-ом нарисованы графики и когда я вожу мышкой по этому графику оно рисовало вертикальную линию, и соотв. когда я мышку вожу, то линия двигается за ней.

Получается надо делать вот так или нет?

Но тогда получается что сама кнопка не будет кликабельной пока я не удалю виджет, к-ый рисует линию поверх кнопки... ?
« Последнее редактирование: Август 16, 2012, 12:53 от carhun » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Август 16, 2012, 13:02 »

Имхо, логичнее для этого использовать QGraphicsView/QGraphicsScene.
Для добавления кнопки на сцену используй QGraphicsWidget.
Для отрисовки вертикальной линии используй QGraphicsLineItem с максимальным zValue().
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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