paintEvent в производном классе QTableView: устройство рисования вернуло движок == 0, тип: 1
Как продолжение индикатора загрузки Qt по анимированному изображению (он же preloader) или как альтернатива? Я пытаюсь рисовать внутри 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
}
Я удивлен, создавая QPainter
не получается, так почему это так. Что я делаю неправильно?
Упрощенная версия по-прежнему дает предупреждение
QPainter p(this);
QTableView::paintEvent(event);
return;
Предупреждение (конечно) исчезло, когда я закомментировал QPainter
так что это действительно кажется основной причиной, но почему?
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().
Примечание. Если вы открываете художник, обязательно откройте его в окне просмотра ().