从 Qt4 移植到 Qt5,Qt::WA_PaintOutsidePaintEvent 不再存在
Posted
技术标签:
【中文标题】从 Qt4 移植到 Qt5,Qt::WA_PaintOutsidePaintEvent 不再存在【英文标题】:Porting from Qt4to Qt5, Qt::WA_PaintOutsidePaintEvent no longer exist 【发布时间】:2018-08-06 13:07:10 【问题描述】:从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
吗?
【问题讨论】:
【参考方案1】:Qt::WA_PaintOutsidePaintEvent
被引入以允许将 Qt3 程序移植到 Qt4。 Qt4 小部件应仅从paintEvent()
绘制,因此在 Qt5 中删除了该属性(好主意!)。所以你应该把所有的绘画代码转移到一个派生的paintEvent()
方法中。
【讨论】:
【参考方案2】:Qt::WA_PaintOutsidePaintEvent 仅在与已随 Qt5 移除的 X11 绘制引擎结合使用时产生效果。因此,您可以简单地删除该行,因为它对 Qt5(或 Qt4,当不运行本机图形系统时)没有影响。
如果没有这个标志,QwtPlotDirectPainter 会使用效率稍低的增量绘制路径,但也可以避免在将代码移动到paintEvent 时遇到必须执行的完全重绘。
【讨论】:
其实我要更正一下:X11绘图引擎已经在Qt 5.10中重新引入,可以通过导出QT_XCB_NATIVE_PAINTING=1来生效。但是由于Qt::WA_PaintOutsidePaintEvent没有重新引入,所以需要修改qwt_plot_directpainter.cpp的代码手动走更高效的渲染路径。以上是关于从 Qt4 移植到 Qt5,Qt::WA_PaintOutsidePaintEvent 不再存在的主要内容,如果未能解决你的问题,请参考以下文章