Объект художника QPainter вне события рисования

Я пытаюсь нарисовать простую двухмерную фигуру в окне QWidget. Определен paintEvent, а также определен объект рисования класса QPainter. Мой рисунок содержит элементы, которые мне нужно рисовать более одного раза в разных местах, такие как линии, текст и т. д. Для этой цели я использую функции для рисования этих линий с различными позициями. Аналогично для текста. Для того, чтобы сделать программу короче, тоже модульная.

Функция paintEvent вызывает функции, которые используются для расчета и рисования.

Как передать объект художника QPainter, определенный в paintEvent, в functions.

например

void Classname::drawText(QString text, int PosX, int PosY, QPainter painter)
{
    QSize size=this->size();

    QFont times("Helvetica [Cronyx]", 10);
    QFontMetrics box(times);

    int boxWidth = box.width(text);
    int boxHeight = box.height();

    painter.setFont(times);
    painter.setPen(Qt::white);
    painter.drawText(PosX,PosY,text);
}

затем я получаю сообщение об ошибке, когда среда vc++ сообщает мне, что имя типа не разрешено для объекта рисования класса QPainter.

Если я определяю объект QPainter painter1, как показано ниже:

void Classname::drawText(QString text, int PosX, int PosY, QPainter painter)
{
    QPainter painter1;

    QSize size=this->size();

    QFont times("Helvetica [Cronyx]", 10);
    QFontMetrics box(times);

    int boxWidth = box.width(text);
    int boxHeight = box.height();

    painter.setFont(times);
    painter.setPen(Qt::white);
    painter.drawText(PosX,PosY,text);
}

программа компилируется, но результата нет.

Это часть кода, я определяю объекты класса QPainter во всех функциях.

Я прочитал эту тему, но инструкции не Чисто. Должны ли функции begin() и end() вызываться во всех случаях рисования или только один раз в функции paintEvent?


person thedorkknight    schedule 15.08.2013    source источник
comment
Я сам выяснил, что объект painter можно передать как QPainter&painter. Тогда работает нормально.   -  person thedorkknight    schedule 15.08.2013
comment
Вы также можете хранить программы рисования внутри файла QPicture. Затем вы просто воспроизводите его в своем paintEvent. Другой способ — использовать QPainterPath для хранения многократно используемой масштабируемой векторной графики.   -  person Kuba hasn't forgotten Monica    schedule 04.09.2013


Ответы (1)


Как вы упомянули, вы должны реализовать эти функции в своем классе.

В вашем заголовке:

class Class
{
// ...
protected:
    virtual void paintEvent( QPaintEvent* aEvent ) override;

private:
    void drawText( QPainter* aPainter, const QString& aText, int aPosX, int aPosY );
    // void drawLine( ... );
};

В вашем источнике:

void Class::paintEvent( QPaintEvent* aEvent )
{
    QPainter painter( this );

    // ...
    drawText( &painter/*, ... */ );
    drawLine( &painter/*, ... */ );
}

void Class::drawText( QPainter* aPainter, const QString& aText, int aPosX, int aPosY )
{
    // Your drawing ...
}
person p.i.g.    schedule 07.06.2015