【问题标题】:Crash on QwtPlotZoomer in QT5QT5 中的 QwtPlotZoomer 崩溃
【发布时间】:2020-02-18 16:31:54
【问题描述】:

我尝试在 QT5 中使用 QwtPlotZoomer,但在其构造函数运行时出现段错误。

class Qwt_widget : public QwtPlot
{
  Q_OBJECT

public:
  Qwt_widget(QWidget* parent = 0) :
    QwtPlot(parent),
    m_canvas()
  {
    QwtPlotZoomer zoomer(&m_canvas); // Crashes here
  }

private:
  QwtPlotCanvas m_canvas;
};

上面的小部件被添加到一个简单的主窗口中,以便创建它(完整代码在https://github.com/chrisburnham/Qwt_qt5_crash)。这里还有我添加到 QT creators 默认 pro 文件中的 QWT 行:

INCLUDEPATH += /usr/include/qwt
LIBS += -lqwt-qt5

我在 Ubuntu 18.04 上运行并安装了带有 libqt5-default (5.9.5) 的 Qt5 和带有 libqwt-qt5-dev (6.1.3) 的 QWT。我用 LDD 检查了我所有的库并查看了我正在使用的头文件,它们都来自使用 libqwt-qt5-dev 安装的包。我以前在 Qt4 中以这种方式使用过QwtPlotZoomers(使用 QWT 的 Qt4 版本),据我从文档中可以看出,它应该仍然可以在这里工作。

【问题讨论】:

  • canvas 是一个局部变量,会在会产生问题的对象完成后被移除,因此一个可能的解决方案是为该类制作一个 canvas 属性。
  • @eyllanesc 我最初将它作为成员变量,它会导致同样的崩溃。如果这有助于澄清崩溃的来源,我可以将其更改回来。
  • 我没有说那是解决方案,但如果是另一个问题的原因

标签: qt qt5 qwt


【解决方案1】:

您需要先将QwtPlotCanvas 分配给QwtPlot,然后再让QwtPlotZoomer 处理它。请注意,QwtPlot::setCanvas() 拥有所有权,因此不要为画布使用成员变量。

但由于您使用的是默认 QwtPlotCanvas 而不是某些派生类,您可能只使用 QwtPlot 附带的画布:

QwtPlotZoomer zoomer(this->canvas()); // Should not crash here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多