QTableView派生类中的paintEvent:绘制设备返回引擎== 0,键入:1

时间:2015-09-18 13:28:16

标签: qt qtableview qpainter qt5.4

作为Qt load indicator by animated image (aka preloader) or alternative?的后续内容,我尝试在QTableView内画画。但是当我初始化QPainter时,我收到以下警告。

QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1

以下是代码(SO答案,with a button it seems to work):

    void CDerivedFromQTableView::paintEvent(QPaintEvent *event)
    {
        QTableView::paintEvent(event); // draw original content
        QPainter p(this); // Problem: QPainter::begin: Paint device returned engine == 0, type: 1
        const QPixmap pm(QPixmap::grabWidget(this->m_loadIndicator));
        QPoint middle = this->geometry().center();
        int x = middle.x() - pm.width() / 2;
        int y = middle.y() - pm.height() / 2;
        p.drawPixmap(QPoint(x, y), pm); // draw load indicator inside QTableView 
    }

我很惊讶创建QPainter失败了,为什么会这样。我做错了什么?

简化版仍然提供警告

        QPainter p(this);
        QTableView::paintEvent(event);
        return;
当我发表评论QPainter时,警告(当然)已经消失了,所以这似乎是根本原因,但为什么呢?

1 个答案:

答案 0 :(得分:6)

由于class Bar(): foo = Foo() param = something @foo.decorate(param) def func(self): # do something QTableView的子类,您应在其视口上打开QAbstractScrollArea

QPainter

The docs说出来:

  

可以在子类中重新实现此事件处理程序以接收绘制   事件(在事件中传递),用于viewport()小部件。

     

注意:如果您打开画家,请务必在视口()上打开它。