从'QWidget *'无效转换为'QwtPlotCanvas *'[-fpermissive]

时间:2013-10-04 09:10:18

标签: c++ qt qwt

我正在尝试按照作者所说的编写程序(在此处找到http://sourceforge.net/projects/lisem/)。但是,在Qt Creator中编译时,会出现错误:

invalid conversion from 'QWidget*' to 'QwtPlotCanvas*' [-fpermissive]

LisUImapplot.cpp

中的这一行
186 picker = new MyPicker( MPlot->canvas() );

链接到其头文件(LisUImapplot.h)可以在与cpp文件相同的文件夹中找到。

class MyPicker: public QwtPlotPicker
{
public:
    MyPicker( QwtPlotCanvas *canvas ):
        QwtPlotPicker( canvas )
    {
        setTrackerMode( AlwaysOn );
    }

    virtual QwtText trackerTextF( const QPointF &pos ) const
    {
        QColor bg( Qt::white );
        bg.setAlpha( 100 );

        QwtPlotItemList list = plot()->itemList(QwtPlotItem::Rtti_PlotSpectrogram);
        QwtPlotSpectrogram * sp = static_cast<QwtPlotSpectrogram *> (list.at(1));
        double z = sp->data()->value(pos.x(), pos.y());
        QString txt = "";
        if (z > -1e10)
            txt.sprintf( "%.3f", z );
        QwtText text = QwtText(txt);
        text.setColor(Qt::black);
        text.setBackgroundBrush( QBrush( bg ) );
        return text;
    }
};

我希望你能帮助我。谢谢!

我正在使用Qt 5.1.1 MinGW 32位和Qwt 6.1.0

2 个答案:

答案 0 :(得分:4)

QwtPlot::canvas()返回QWidget。您的MyPicker构造函数需要QwtPlotCanvas类型参数。

您可以将其投射到QwtPlotCanvas

QwtPlotCanvas *canvas = qobject_cast<QwtPlotCanvas*>(MPlot->canvas());
if(canvas)
{
   picker = new MyPicker(canvas);
   ...
}

答案 1 :(得分:0)

你为什么要做构造函数?

MyPicker( QwtPlotCanvas *canvas ):
    QwtPlotPicker( canvas ){}  

旧版Qwt是QwtPlotPicker :: QwtPlotPicker(QwtPlotCanvas canvas); 在Qwt 6.1中。是QwtPlotPicker :: QwtPlotPicker(QWidget * parent);

你必须做

MyPicker( QWidget *canvas ):
    QwtPlotPicker( canvas ){}