Qt Beginner: виджет QPainter не рендерится - PullRequest
2 голосов
/ 06 ноября 2011

У меня нет большого опыта работы с Qt, и у меня возникают проблемы с использованием QPainter.Я пытаюсь создать простой графический виджет, который принимает несколько точек и создает QVector из QPoints, а затем использует этот вектор для рисования многоугольника.Тем не менее, ничего не появляется прямо сейчас с моей реализацией.Я совершенно уверен, что правильно добавил виджет в окно, так как вижу пустое пространство, которое он должен занимать.Это приводит меня к мысли, что проблема заключается в графическом виджете.Любая помощь приветствуется.

header:

//graph.h

#ifndef GRAPH_H
#define GRAPH_H

#include <QWidget>
#include <QPainter>
#include <QVector>

class Graph : public QWidget
{
    Q_OBJECT

public:
    Graph(QWidget *parent = 0);
    QSize minimumSizeHint() const;
    QSize maximumSizeHint() const;
    QSize sizeHint() const;

    void addPoint(int w, int h);
    void clearPoints();
    void drawGraph();


protected:
    void paintEvent(QPaintEvent *event);


private:
    QPen pen;
    QBrush brush;
    QPixmap pixmap;
    QVector<QPoint> points;

};

#endif // GRAPH_H

source:

//graph.cpp

#include "graph.h"

Graph::Graph(QWidget *parent)
    : QWidget(parent)
{
    points.resize(0);

    setBackgroundRole(QPalette::Base);
    setAutoFillBackground(true);
}

void Graph::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setPen(QPen(Qt::NoPen));
    painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.drawPolygon(points);
}

QSize Graph::minimumSizeHint() const
{
    return sizeHint();
}

QSize Graph::maximumSizeHint() const
{
    return sizeHint();
}

QSize Graph::sizeHint() const
{
    return QSize(500, 200);
}

void Graph::addPoint(int w, int h)
{
    points.append(QPoint(w*2, h*2));
}

void Graph::clearPoints()
{
    points.clear();
}

void Graph::drawGraph() {
    points.prepend(QPoint(0,0)); //The base points of the graph
    points.append(QPoint(500,0));
    update();
    points.clear();
}

Ответы [ 2 ]

4 голосов
/ 06 ноября 2011

В drawGraph() вызов update() публикует событие, уведомляющее виджет о том, что он нарисовал себя. Затем вы очищаете точки и выходы drawGraph(). После этого цикл обработки событий обработает событие обновления и вызовет вызов paintEvent(), но к тому времени в векторе точек для рисования не будет точек.

Не думайте о paintEvent() как о том, что рисуете что-то постоянное на виджете один раз, который будет отображаться вечно, пока вы не очистите его и не нарисуете что-то еще. paintEvent() должен иметь возможность рисовать виджет с нуля всякий раз, когда его нужно перерисовать. Часто это происходит из-за запроса системы, когда виджет перемещается, минимизируется и восстанавливается и т. Д. Это означает, что ваш вектор точек должен оставаться до тех пор, пока вы больше не захотите, чтобы отображался многоугольник или точки менялись.

0 голосов
/ 06 ноября 2011

Похоже, вы добавляете только два пункта в свой список.Я не думаю, что возможно иметь многоугольник только с двумя точками;попробуйте добавить третью точку и посмотрите, получите ли вы треугольник.

...