2

painterというクラスを作成QPainterし、コンストラクターでpを作成QMainWindowしてパラメーターとしてを渡しました。

したがって、mainwindow.hiに次のように追加しました。

protected:
    void paintEvent(QPaintEvent *e);

private:
    Ui::MainWindow *ui; // Created by the QT
    Painter* p;

mainwindow.cppに追加しました

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    p=new Painter(this);
}

void MainWindow::paintEvent(QPaintEvent *e)
{
    p->render(this);
}

Painter.h

#ifndef PAINTER_H
#define PAINTER_H
#include <QtCore>
#include <QtGui>

class Painter
{
private:
    QPainter* painter;
    bool init;

public:
    Painter(QMainWindow* m);
    ~Painter();

    void render(QMainWindow* m);
};

#endif // PAINTER_H

およびpainter.cpp

#include "painter.h"

Painter::Painter(QMainWindow* m)
{
    painter=new QPainter(m);
    //init=false;
}

void Painter::render(QMainWindow* m)
{
    painter->drawLine(10, 3,123, 909);
}

何も描かない。

私が行った場合

void Painter::render(QMainWindow* m)
{
    painer->begin(m);
    painter->drawLine(10, 3,123, 909);
}

線をレンダリングし、2〜3秒後に閉じます

それを機能させる唯一の方法は、

void Painter::render(QMainWindow* m)
{
    QPainter p(m);
    p.drawLine(10, 3,123, 909);
}

しかし、すべてのフレームでpを初期化するのはばかげているようです、それはそのように機能します。画面を一度だけ初期化する方法や、開始を機能させる方法はありますか?

ありがとう。

4

2 に答える 2

1

で解決しました

painter->begin(this->m);
painter->drawLine(10, 2, 1232, 1222);
painter->end();

私にはばかげているように見えますが、すべてのフレームで宣言するよりはましです。誰かがより良いアイデアを持っている場合。

ありがとう

于 2012-07-19T20:04:36.700 に答える
0

あなたはQPainterそれが意図されている方法を使用していません。基本的に、aQPainterはを使用して作成されることを意味します

QPainter p(this);

ペイントイベントハンドラー内。必要に応じて、ポインタを使用してペインターを渡すこともできますが、へのポインタを多すぎると、そのような問題が発生する可能性がありますQPainter

私の理解では、ペイントイベントが発生している場合にのみ、ペインタが適切に初期化されます。そのため、で初期化するPainter::Painter(QMainWindow* m)と機能しなくなりますQPainter

于 2015-06-10T20:53:15.853 に答える