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

Hor*_*ter 3 qt qtableview qpainter qt5.4

作为动画图像(又名预加载器)或替代品Qt负载指示器的跟进我试着在里面画画QTableView.但是当我初始化时,QPainter我收到以下警告.

QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
Run Code Online (Sandbox Code Playgroud)

这是代码(SO答案,它似乎有一个按钮):

    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 
    }
Run Code Online (Sandbox Code Playgroud)

我很惊讶创造QPainter失败,为什么会这样.我究竟做错了什么?

简化版仍然提供警告

        QPainter p(this);
        QTableView::paintEvent(event);
        return;
Run Code Online (Sandbox Code Playgroud)

当我发表评论时QPainter,警告(当然)消失了,所以它似乎是根本原因,但为什么呢?

han*_*ank 7

作为QTableView子类,QAbstractScrollArea您应该QPainter在其视口上打开:

void CDerivedFromQTableView::paintEvent(QPaintEvent *event)
{
    QTableView::paintEvent(event); // draw original content

    QPainter p(this->viewport());
    p.drawRect(0, 0, 20, 20);
}
Run Code Online (Sandbox Code Playgroud)

文档说:

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

注意:如果您打开画家,请确保在视口()上打开它.