从 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 不再存在的主要内容,如果未能解决你的问题,请参考以下文章

将 Qt5 应用程序反向移植到 Qt4 时替换 Q_NULLPTR?

移植QT5.6到嵌入式开发板(史上最详细的QT移植教程)

Qt5 (Linux/LXDE) 中不显示系统托盘图标

测试从 qt4 迁移到 qt5 的库时出现分段错误

qt4升级到qt5的一些问题

LinuxQT5移植到Linux ARM