Russian Qt Forum

Qt => Вопросы новичков => Тема начата: carhun от Август 14, 2012, 10:52



Название: QWidget and QPainter
Отправлено: carhun от Август 14, 2012, 10:52
Добрый день.

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

пробую вот так this->painterEngine()->painter() не помогает, постоянно начинает вылетать приложение...


Название: Re: QWidget and QPainter
Отправлено: GreatSnake от Август 14, 2012, 11:02
Получить "правильный" QPainter от QWidget позволительно только в перегруженном QWidget::paintEvent():
Код
C++ (Qt)
QPainter painter( this );
О чём, кстати, с примерами описано в руководстве (http://www.doc.crossplatform.ru/qt/4.7.x/qpainter.html#QPainter-2).


Название: Re: QWidget and QPainter
Отправлено: carhun от Август 14, 2012, 11:27
Спасибо.

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

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


Название: Re: QWidget and QPainter
Отправлено: GreatSnake от Август 14, 2012, 11:35
Т.е. если у себя заведу переменную в классе типа QPainter и при вызову QPaintEvent сохраню там себе в эту перменную QPainter, то я с этим QPainter'м вне QPaintEvent не смогу работать?
По умолчанию нет, не сможешь.

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


Название: Re: QWidget and QPainter
Отправлено: carhun от Август 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();
}


Название: Re: QWidget and QPainter
Отправлено: GreatSnake от Август 14, 2012, 12:36
Код верный. Ищи причину в другом.


Название: Re: QWidget and QPainter
Отправлено: carhun от Август 16, 2012, 12:11
Все равно получается, так что если есть какой-то еще виджет, то он перекрывает, то что на нем нарисовано...
Вот пример.
Хочется так что бы линия рисовалась и поверх кнопки...


Название: Re: QWidget and QPainter
Отправлено: GreatSnake от Август 16, 2012, 12:16
А что, кнопка разве не виджет? У неё свой paintEvent() и естественно её отрисовка будет поверх родительского виджета.
Это же очевидно ???
Ты бы лучше описал, что хочешь получить на выходе, а не боролся с тем, в чём мало разбираешься.


Название: Re: QWidget and QPainter
Отправлено: carhun от Август 16, 2012, 12:39
Та получается мне нужен заводить еще одни виджет, к-ый будет рисовать поверх...

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

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

Но тогда получается что сама кнопка не будет кликабельной пока я не удалю виджет, к-ый рисует линию поверх кнопки... ?


Название: Re: QWidget and QPainter
Отправлено: GreatSnake от Август 16, 2012, 13:02
Имхо, логичнее для этого использовать QGraphicsView/QGraphicsScene.
Для добавления кнопки на сцену используй QGraphicsWidget.
Для отрисовки вертикальной линии используй QGraphicsLineItem с максимальным zValue().