QPainter初始画家并使用它

时间:2012-07-19 18:21:20

标签: c++ qt-creator qpainter

我创建了一个名为painter的类,并在构造函数中创建了QPainter p,并将QMainWindow作为参数传递。

所以在mainwindow.h中我添加了:

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,它的工作方式就是这样。 有一种方法可以初始化屏幕一次或开始工作吗?

感谢。

2 个答案:

答案 0 :(得分:1)

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

这对我来说似乎很愚蠢,但它比在每一帧都声明它更好。 如果有人有更好的主意。

由于

答案 1 :(得分:0)

您没有使用QPainter它的意图。基本上,QPainter意味着使用

创建
QPainter p(this);

内部 paint事件处理程序。如果你需要,你仍然可以使用指针传递画家,但是如果使用过多指针QPainter,你可能会遇到类似的问题。

我的理解是,只有在绘制事件发生时,画家才能正确初始化,这就是为什么Painter::Painter(QMainWindow* m)中的初始化会产生无效的QPainter