Qt初学者:QPainter小部件无法渲染

时间:2011-11-06 07:00:50

标签: c++ qt qpainter

我对Qt没有多少经验,我在使用QPainter时遇到了麻烦。 我正在尝试创建一个简单的图形小部件,它接受许多点并创建QVector QPoints,然后使用此向量绘制多边形。但是,我的实施现在没有出现任何内容。我相当确定我已经正确地将窗口小部件添加到窗口,因为我可以看到它应该占用的空白空间。这让我相信图形小部件中的问题。 任何帮助表示赞赏。

头:

//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

源:

//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 个答案:

答案 0 :(得分:4)

drawGraph()中,对update()的调用会发布一个事件,通知窗口小部件自行绘制。然后清除点和drawGraph()呼叫退出。之后,事件循环将处理更新事件并触发对paintEvent()的调用,但到那时,要绘制的点矢量中没有点。

不要认为paintEvent()会在窗口小部件上永久地绘制一些永久显示的内容,直到您清除它并绘制其他内容为止。 paintEvent()需要能够在需要重绘时从头开始绘制窗口小部件。这通常是由于移动,最小化和恢复窗口小部件时系统的请求等。这意味着您的点矢量需要保留,直到您不再需要显示多边形或更改点为止。

答案 1 :(得分:0)

看起来您可能只在点数列表中添加两个点。我不认为有一个只有两个点的多边形是可能的;尝试添加第三个点,看看你是否得到一个三角形。