Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Подскажите как работать с QPainter

Автор: bayah 18.5.2011, 16:44

Не пойму как толком работает QPainter. Поэтому вот элементарный код который я тестил:

#include <QtGui/QApplication>
#include <QWidget>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget *b = new QWidget;                //Создаю QWidget
    QPainter *painter = new QPainter(*b);   //создаю QPainter, передаю ему указатель на QWidget.
    painter->drawLine(10, 10, 300, 300);   //рисую линию

    b->show();
    b->repaint();

    return a.exec();

}

В результате ничего не отображается. Почему?

Сразу задам мучающие меня вопросы по этому поводу:
- для чего метод begin(QPaintDevice*), если мы девайс для отрисовки указываем и так при создании?
- (собственно что мне нужно от этой отрисовки) как вывести на главный виджет какую нибудь область(другой виджет - QGraphicsView, например) и рисовать только на нем

мерси

Автор: Litkevich Yuriy 19.5.2011, 6:12

Потому-что рисование осуществляется не в произвольном месте программы, а в обработчике события рисования QWidget::paintEvent.
Что приведено в элементарном примере из http://doc.crossplatform.ru/qt/4.5.0/qpainter.html#details:

Цитата
Warning: When the paintdevice is a widget, QPainter can only be used inside a paintEvent() function or in a function called by paintEvent();

Автор: bayah 20.5.2011, 10:03

Да, спасибо, уже разобрался.

Короче придется наследовать класс, в нем переопределять QPaintEvent, потом создавать его динамически...
Поначитал тут столько извращений, типа как рисовать на дочернем виджете из родительского окна: перехватывать сообщения, вызывать отрисовку потомка, потом рисовать поверх. У меня все равно почему-то не заработало, но это ладно - от такого подхода я уже отказался.

Буду либо переопределять, либо рисовать на QGraphicsView с помошью QPainterPath, QGraphicsScene.
А эту тему можно закрыть и даже удалить лучше, - чтобы те, кто будет искать ответы на вопросы подобные моим в этой теме не спотыкались.)

Автор: bayah 20.5.2011, 18:31

Хотя у меня че-то не работает даже примитивный код.
Тут я пытаюсь унаследовать от создать класс DrawWidget унаследовав его от QGraphicWidget переопределив в нем paintEvent и отрисовать в нем что нибудь.
Вот такой код. Почему не отрисовывается?


drawwidget.h
#ifndef DRAWWIDGET_H
#define DRAWWIDGET_H

#include <QtGui>

class DrawWidget : public QGraphicsView{

public:
    DrawWidget(QWidget *parent = 0);

protected:
    void paintEvent(QPaintEvent *event);

private:

};

#endif // DRAWWIDGET_H

drawwidget.cpp


drawwidget.cpp
#include "DrawWidget.h"
#include <QtGui>

DrawWidget::DrawWidget(QWidget* parent):
        QGraphicsView(parent)
{

}


void DrawWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawLine(10, 10, 40, 50);

}



main.cpp
#include <QtGui/QApplication>
#include "dialog.h"
#include "DrawWidget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget pWidget;
    DrawWidget pView(&pWidget);
    QVBoxLayout pLayout;
    pLayout.addWidget(&pView);

    pView.show();
    pWidget.setLayout(&pLayout);
    pWidget.show();

    return a.exec();
}

Автор: Litkevich Yuriy 20.5.2011, 21:10

Цитата(bayah @ 20.5.2011, 21:31) *
унаследовав его от QGraphicWidget
а почему от QGraphicWidget, а не от QWidget?

Автор: bayah 21.5.2011, 1:48


Цитата
а почему от QGraphicWidget, а не от QWidget?

Ой - QGraphicsView, а не QGraphicsWidget коечно же - это описка.

class DrawWidget : public QGraphicsView

Автор: Litkevich Yuriy 21.5.2011, 7:12

ты что-то вообще не то делаешь.
В Qt есть два способа рисования: http://doc.crossplatform.ru/qt/4.7.x/qt4-arthur.html (рисование в paintEvent виджета), и http://doc.crossplatform.ru/qt/4.7.x/graphicsview.html (создание элементов на сцене и отображение их в представлении).


Автор: bayah 21.5.2011, 10:52

Цитата
ты что-то вообще не то делаешь.


а что я не то делаю? я переоределяю paintEvent у созданного мной потомка от QGraphicsView
QgraphicsView тут я использую как обычный виджет с возможностью рисовать на нем.


Цитата
В Qt есть два способа рисования: Артур (рисование в paintEvent виджета)

ну вот я и рисую так вроде бы?

Автор: bayah 21.5.2011, 15:42

блин, унаследовался от QWidget и тогда только нарисовалось.
Но почему нельзя чтобы рисовалось на виджете наследованном от QGraphicsView?

Автор: Litkevich Yuriy 21.5.2011, 16:01

Цитата(bayah @ 21.5.2011, 18:42) *
Но почему нельзя чтобы рисовалось на виджете наследованном от QGraphicsView?
а зачем!?!?!?!?

если тебе нужен велосипед с тремя колёсами, и у тебя будет выбор для основы - Простой велосипед, ..., БелАЗ.
Ты же не будешь за основу БелаАЗ(!) брать, правильно?

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)