2

私は Qt の経験があまりなく、使用に問題がありQPainterます。QVector多数のポイントを取り、 ofを作成し、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

ポイント リストにポイントを 2 つだけ追加しているようです。2 点だけの多角形はありえないと思います。3 番目のポイントを追加して、三角形が得られるかどうかを確認してください。

于 2011-11-06T08:02:03.747 に答える