Портирование с Qt4 на Qt5, Qt::WA_PaintOutsidePaintEvent больше не существует

При портировании с Qt4 на Qt5 есть класс GraphWidget, который наследуется от класса QWidget.

m_plot = new QwtPlot(this);  
ui->verticalLayout->addWidget(m_plot);
……
m_directPainter = new QwtPlotDirectPainter(m_plot->canvas());  
m_plot->canvas()->setAttribute(Qt::WA_PaintOutsidePaintEvent, true);
……
m_directPainter.drawSeries(……);

Атрибут Qt::WA_PaintOutsidePaintEvent больше не существует. Что мне сделать, чтобы m_directPainter работал правильно?

Как я узнал из документов Qt5, должен ли я реализовать функцию paintEvent() и вызвать там painter?


person biying wang    schedule 06.08.2018    source источник


Ответы (2)


Qt::WA_PaintOutsidePaintEvent был введен, чтобы разрешить перенос программ Qt3 на Qt4. Виджеты Qt4 должны рисовать только из paintEvent(), поэтому в Qt5 этот атрибут был удален (хорошая идея!). Таким образом, вы должны перенести весь код рисования в производный метод paintEvent().

person Jens    schedule 06.08.2018

Qt::WA_PaintOutsidePaintEvent имеет эффект только в сочетании с механизмом рисования X11, который был удален с Qt5. Таким образом, вы можете просто удалить строку, так как она не работает с Qt5 (или с Qt4, когда не работает собственная графическая система).

Без этого флага QwtPlotDirectPainter использует несколько менее эффективный путь для постепенного рисования, но также избегает полной перерисовки, которую необходимо выполнять при перемещении кода в paintEvent.

person Uwe    schedule 27.08.2018
comment
На самом деле я должен исправить себя: механизм рисования X11 был повторно представлен с Qt 5.10, и его можно сделать эффективным, экспортировав QT_XCB_NATIVE_PAINTING=1. Но поскольку Qt::WA_PaintOutsidePaintEvent не был повторно введен, вам необходимо вручную изменить код qwt_plot_directpainter.cpp, чтобы выберите более эффективный путь рендеринга. - person Uwe; 09.09.2018