【问题标题】:paintEvent in QTableView derived class: Paint device returned engine == 0, type: 1QTableView 派生类中的paintEvent:绘制设备返回引擎 == 0,类型:1
【发布时间】:2015-09-18 13:28:16
【问题描述】:

作为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

这是代码(所以回答,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 
    }

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

简化版仍然给出警告

        QPainter p(this);
        QTableView::paintEvent(event);
        return;

当我注释掉QPainter 时,警告(当然)消失了,所以这似乎是根本原因,但为什么呢?

【问题讨论】:

  • 你应该打电话给QPainter painter(this);而不是QPainter(this);

标签: qt qtableview qpainter qt5.4


【解决方案1】:

由于QTableViewQAbstractScrollArea 的子类,您应该在其视口上打开QPainter

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

    QPainter p(this->viewport());
    p.drawRect(0, 0, 20, 20);
}

The docs说出来:

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

注意:如果您打开一个painter,请确保在viewport() 上打开它。

【讨论】:

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