【问题标题】:Porting from Qt4to Qt5, Qt::WA_PaintOutsidePaintEvent no longer exist从 Qt4 移植到 Qt5,Qt::WA_PaintOutsidePaintEvent 不再存在
【发布时间】: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吗?

【问题讨论】:

    标签: qt qt5 qwt setattribute paintevent


    【解决方案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的代码手动走更高效的渲染路径。
      猜你喜欢
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多