paintEvent в производном классе QTableView: устройство рисования вернуло движок == 0, тип: 1

В качестве продолжения индикатор загрузки Qt с помощью анимированного изображения ( он же предварительный загрузчик) или альтернатива? Я пытаюсь рисовать внутри файла QTableView. Но когда я инициализирую QPainter, я получаю следующие предупреждения.

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

Вот код (ответ ТАК, с кнопкой, кажется, работает):

    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, так что это действительно кажется основной причиной, но почему?


person Horst Walter    schedule 18.09.2015    source источник
comment
Вероятно, вам следует вызвать QPainter painter(this); вместо QPainter(this);.   -  person vahancho    schedule 18.09.2015


Ответы (1)


Поскольку QTableView является подклассом QAbstractScrollArea, вы должны открыть QPainter в его окне просмотра:

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

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

В документы говорят:

Этот обработчик событий может быть повторно реализован в подклассе для получения событий рисования (переданных в событии) для виджета viewport().

Примечание. Если вы открываете рисовальщик, обязательно откройте его в окне просмотра().

person hank    schedule 18.09.2015