【问题标题】:Why is QPainter not drawing to my QWidget?为什么 QPainter 没有绘制到我的 QWidget 上?
【发布时间】:2017-03-26 05:43:19
【问题描述】:

我正在尝试在我的窗口上画一条线,但我无法实际绘制任何东西。

我的.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 缺少一些东西,但我没有在网上看到任何建议我需要用它调用任何其他函数的东西。

我错过了什么?

感谢您的宝贵时间。

【问题讨论】:

    标签: c++ linux qt qpainter


    【解决方案1】:

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

    每个小部件都在其内部执行所有绘画操作 油漆事件()函数。每当需要小部件时调用它 由于某些外部更改或在请求时重绘 由应用程序。

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

    【讨论】:

    • 我花了很多时间研究paintEvent 文档,并通过几篇文章发现您可以将PaintOutsidePaintEvent 属性设置为true,这样就可以在QWidget 的PaintEvent 之外进行绘制。 window-&gt;setAttribute(Qt::WA_PaintOutsidePaintEvent, true); 所以我不明白为什么我不能在paintEvent 之外使用我的QPainter,因为我已经在“绘画”之前设置了它的属性。
    • 这里是其中一篇文章的链接...评论在底部。 forum.qt.io/topic/4932/a-question-about-paintevent-function/6 评论很旧,但它是 Qt 4,所以我认为它仍然有效,而且我没有任何编译或运行时错误。
    • 显然它没有按预期工作。它是已从 Qt 5 中删除的遗留内容,当它仍在 Qt 中时,建议仅在移植 Qt 3 代码时使用它。只需按照预期在绘画事件中绘画即可。
    【解决方案2】:

    所以之前my research 教过我,如果我实现了 setAttribute 函数:

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

    我的 QPainter 将能够在 QWidget::paintEvent(QPaintEvent*) 函数调用之外进行打印。

    Dtech 指出它是一个遗留功能,在 Qt 5 中不再存在。当我在 Ubuntu 上在 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 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多