2

我对 Qt 没有太多经验,并且在使用QPainter. 我正在尝试制作一个简单的图形小部件,它接受多个点并创建一个QVectorof 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();
}
4

2 回答 2

4

drawGraph()中,调用update()发布一个事件,通知小部件绘制自己。然后您清除积分并drawGraph()退出呼叫。之后,事件循环将处理更新事件并触发paintEvent()

不要认为paintEvent()在小部件上绘制永久的东西,一旦将其永久显示,直到您清除它并绘制其他东西。paintEvent()需要能够在需要重绘时从头开始绘制小部件。这通常是由于在移动、最小化和恢复小部件等时来自系统的请求。这意味着您的点向量需要保留,直到您不再希望显示多边形或更改点。

于 2011-11-06T08:11:25.750 回答
0

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

于 2011-11-06T08:02:03.747 回答