为什么QPainter没有绘制到我的QWidget?

时间:2017-03-26 05:43:19

标签: c++ linux qt qpainter

我试图在我的窗口画一条线,但我还没有能够得到任何实际绘制的东西。

我的.h

#ifndef BOARD_H
#define BOARD_H

#include <Disc.h>
#include <iostream>
#include <QApplication>
#include <QPaintEvent>

class Board
{
    private:
        int currentDiscs;   
        Disc* discArray[64];
        char* first;
        QWidget* window;
    public:
        Board(int*);
        int StartDrawing(QApplication*);

};

#endif

}

我的.cpp

int Board::StartDrawing(QApplication* app) 
{
int WIDTH = 640;
int HEIGHT = 800;

QWidget* window = new QWidget();

window->setAttribute(Qt::WA_PaintOutsidePaintEvent, true);
window->setFixedSize(WIDTH, HEIGHT);
window->setWindowTitle("Title!");

this->window = window;
window->show();

QPainter* painter = new QPainter(window);
//QPixmap pixmap1("\\images\\tile_1.png");

//painter->drawPixmap(QPoint(0,0), pixmap1);  // this works
painter->setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
painter->drawLine(10,10,100,500);
delete painter;

return app->exec();
}

我的猜测是我在QPainter上遗漏了一些东西,但我还没有在网上看到任何建议我需要调用任何其他功能。

我错过了什么?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

read the documentation总是有用的,你的错误最常见:

  

每个小部件都在其中执行所有绘制操作   paintEvent()函数。只要小部件需要,就会调用此方法   重新绘制,或者由于某些外部更改或在请求时重新绘制   通过申请。

您必须只从该窗口小部件的绘制事件中绘制一个窗口小部件。其他油漆设备受限制较少,您可以从任何地方到另一个油漆设备进行绘制,如果需要,可以在其绘制事件中将缓存绘制到窗口小部件。请注意,在某些平台上QPixmap可能不支持从主线程以外的线程进行绘制。

答案 1 :(得分:-1)

所以以前my research告诉我,如果我实现了setAttribute函数:

QWidget::setAttribute(Qt::WA_PaintOutsidePaintEvent, true);

我的QPainter可以在QWidget::paintEvent(QPaintEvent*)函数调用之外打印。

Dtech指出它是遗留功能,在Qt 5中不再存在。当我在Utntu上编译Qt 4.8.7时,我认为功能仍然存在并设法找到documentation(ctrl + f PaintOutsidePaintEvent)。

WA_PaintOutsidePaintEvent:

  

可以使用QPainter在paintEvent()外部的小部件上绘制。 Windows,Mac OS X或嵌入式Linux不支持此标志。我们建议您仅在将Qt 3代码移植到Qt 4时使用它。

因此,必须假设此属性设置仅在将Qt 3代码移植到Qt 4时才能正常运行。

因此,错误在于尝试实现QWidget的overriding the paintEvent函数的QWidget :: setAttribute函数INSTEAD。