“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.htmlmpiChart.cpp
没用,mpiChart.h
会有所帮助。
mpiPlotZoomer.cpp
也无用,mpiPlotZoomer.h
会有所帮助
【参考方案1】:
由于在用于 Qt 4.7 的 Qwt 版本和用于 5.8 的 Qwt 1.6.3 之间删除了 setMargin
函数,因此您别无选择:
setMargin
调用替换为 setCanvasMargin
或者,删除setMargin
调用
两者都试一下,看看哪一个在显示 GUI 时看起来最好。
对于canvas()
错误,如果没有看到mpiChart
和mpiPlotZoomer
声明就很难判断。不过,我会试一试:
canvas()
过去用于返回 QwtPlotCanvas*
。对于最新版本的 Qwt,它返回 QWidget*
。因此,如果您的 mpiPlotZoomer
构造函数需要 QwtPlotCanvas*
作为参数,您必须:
QwtPlotCanvas*
中的mpiPlotZoomer
参数类型替换为QWidget*
。如果编写 mpiPlotZoomer
类的人实际上没有使用和 QwtPlotCanvas
成员/属性(他可能只将其用于育儿目的),则可能会起作用
或将mpiPlotZoomer(chart->canvas());
替换为mpiPlotZoomer( qobject_cast<QwtPlotCanvas*>( chart->canvas() ) );
,这样可以正常工作。
【讨论】:
以上是关于“QwtPlotLayout”中没有名为“setMargin”的成员 - 将 Qt4.7 转换为 Qt5.8的主要内容,如果未能解决你的问题,请参考以下文章