“QwtPlotLayout”中没有名为“setMargin”的成员 - 将 Qt4.7 转换为 Qt5.8

Posted

技术标签:

【中文标题】“QwtPlotLayout”中没有名为“setMargin”的成员 - 将 Qt4.7 转换为 Qt5.8【英文标题】:No member named 'setMargin' in 'QwtPlotLayout' - Convert Qt4.7 to Qt5.8 【发布时间】:2017-03-13 14:17:29 【问题描述】:

我需要将 Qt 遗留代码从 4.7 转换为 5.8,我在 Qt Creator 4.2.1 Clang 7.0(Apple) 64bit 中出现编译错误。我正在使用最新的 Qwt 6.1.3

查看 .cpp 文件

#include "frmMainChart_UI.h"
#include <QHeaderView>
#include <qwt_plot_layout.h>
#include <qwt_legend.h>
#include "mpiDateScale.h"
#include "mpiPercentScale.h"

void frmMainChart_UI::setupUI(QWidget *parent_)

    frmMainTableViewTree_UI::setupUI(QMap<int, QString>(), false, parent_);
    delete frmMainTableViewTree_UI::tableCopy;
    delete frmMainTableViewTree_UI::table;

    chart = new mpiChart(widget);
    chart->setAxisScaleDraw(QwtPlot::xBottom, new mpiDateScale());
    chart->setAxisScaleDraw(QwtPlot::yLeft, new mpiPercentScale());
    chart->plotLayout()->setCanvasMargin(20);
    chart->plotLayout()->setMargin(20);  // BROKE convert Qt4 to Qt5
    chartZoomer = new mpiPlotZoomer(chart->canvas()); // BROKE convert Qt4 to Qt5
    chartLegend = new QwtLegend(chart);
    chart->insertLegend(chartLegend, QwtPlot::RightLegend);

    QLinearGradient grad(0, 0, 1, 1);
    grad.setCoordinateMode(QGradient::StretchToDeviceMode);
    grad.setColorAt(0, Qt::white);
    grad.setColorAt(1, QColor(220, 220, 220));

.cpp 中的 2 个错误

../src/ui/frmMainChart_UI.cpp:18:26: 错误:在“QwtPlotLayout”中没有名为“setMargin”的成员 图表->plotLayout()->setMargin(20); // BROKE 将 Qt4 转换为 Qt5

../src/ui/frmMainChart_UI.cpp:19:23: 错误:'mpiPlotZoomer' 的初始化没有匹配的构造函数 chartZoomer = new mpiPlotZoomer(chart->canvas()); // BROKE 将 Qt4 转换为 Qt5

           ^

生成 5 个警告和 2 个错误 make: *** [frmMainChart_UI.o] 错误 1 06:58:25:进程“/usr/bin/make”以代码 2 退出。 构建/部署项目 mypersonalindex 时出错(套件:Desktop Qt 5.8.0 clang 64bit) 执行步骤“Make”时 06:58:25:经过时间:00:01。

Qwt 6.1.3 Docs有成员函数http://qwt.sourceforge.net/class_qwt_plot_layout.html

void    setCanvasMargin (int margin, int axis=-1)

但是没有使用成员函数

setMargin

我的 C++ 技能非常有限,您是否看到任何可以将其从 Qt4 转换为 Qt5 的小调整。 ...那么替换是什么?

查看 mpiChart.h 可能与 canvas() 错误有关

#ifndef MPICHART_H
#define MPICHART_H

#include "qwt_plot.h"

class mpiChart : public QwtPlot

    Q_OBJECT

public:
    mpiChart(QWidget *parent_ = 0):
        QwtPlot(parent_)
    

public slots:
    void exportChart();
;

#endif // MPICHART_H

查看 mpiPlotZoomer.h 与 canvas() 错误有关

#ifndef MPIPLOTZOOMER_H
#define MPIPLOTZOOMER_H

#include <qwt_plot_zoomer.h>
#include <qwt_plot_canvas.h>  // JDL convert Qt4 to Qt5
#include <qwt_compat.h>  // JDL convert Qt4 to Qt5

class mpiPlotZoomer: public QwtPlotZoomer

public:
    mpiPlotZoomer(QwtPlotCanvas *canvas_):
        QwtPlotZoomer(canvas_, false)
    
        setTrackerMode(AlwaysOn);
    

    virtual QwtText trackerText(const QwtDoublePoint &pos_) const;
;

#endif // MPIPLOTZOOMER_H

【问题讨论】:

你在 Qt 4.7 中使用的是什么版本的 Qwt? 奇怪,带有 Qt 4.7 的 Qwt 似乎是 2011 年的 Qwt 5.5.5,(但最新的 Qwt 有这个现在与 Qt5.8 一起安装的 1.6.3 版本) 最新的 qwt 版本是 6.1.3,而不是 1.6.3:qwt.sourceforge.net/index.html mpiChart.cpp 没用,mpiChart.h 会有所帮助。 mpiPlotZoomer.cpp 也无用,mpiPlotZoomer.h 会有所帮助 【参考方案1】:

由于在用于 Qt 4.7 的 Qwt 版本和用于 5.8 的 Qwt 1.6.3 之间删除了 setMargin 函数,因此您别无选择:

如果符合您的需要,请将 setMargin 调用替换为 setCanvasMargin 或者,删除setMargin 调用

两者都试一下,看看哪一个在显示 GUI 时看起来最好。

对于canvas() 错误,如果没有看到mpiChartmpiPlotZoomer 声明就很难判断。不过,我会试一试:

canvas() 过去用于返回 QwtPlotCanvas*。对于最新版本的 Qwt,它返回 QWidget*。因此,如果您的 mpiPlotZoomer 构造函数需要 QwtPlotCanvas* 作为参数,您必须:

QwtPlotCanvas* 中的mpiPlotZoomer 参数类型替换为QWidget*。如果编写 mpiPlotZoomer 类的人实际上没有使用和 QwtPlotCanvas 成员/属性(他可能只将其用于育儿目的),则可能会起作用 或将mpiPlotZoomer(chart-&gt;canvas()); 替换为mpiPlotZoomer( qobject_cast&lt;QwtPlotCanvas*&gt;( chart-&gt;canvas() ) );,这样可以正常工作。

【讨论】:

以上是关于“QwtPlotLayout”中没有名为“setMargin”的成员 - 将 Qt4.7 转换为 Qt5.8的主要内容,如果未能解决你的问题,请参考以下文章

java类中的get,set属性的作用

增加twig文件中的值

MySQL-刷题记录

177. Nth Highest Salary

MATLAB—地图

创建DataFrame