2

ウィンドウに単純な 2 次元図形を描画しようとしていQWidgetます。がpaintEvent定義されており、クラスのペインタ オブジェクトQPainterも定義されています。私の図面には、線やテキストなど、さまざまな場所に複数回描画する必要がある要素が含まれています。この目的のために、関数を使用してこれらの線をさまざまな位置に描画しています。テキストについても同様です。プログラムを短くするために、モジュール化も行います。

関数は、paintEvent計算と描画に使用される関数を呼び出しています。

QPainterで定義されたペインタ オブジェクトpaintEventを関数に渡すにはどうすればよいですか。

例えば

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);
}

QPainter次に、クラスのペインタ オブジェクトに対して型名が許可されていないことを vc++ 環境が通知しているというエラーが表示されます。

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()andend()関数は、描画のすべてのインスタンスで呼び出す必要がありますか、paintEventそれとも関数内で 1 回だけ呼び出す必要がありますか?

4

1 に答える 1

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 ...
}
于 2015-06-07T19:58:32.497 に答える