错误:无法转换'((const MyClass *)this) - > MyClass :: myLabel'从'QLabel * const'转换为'QLabel'

时间:2017-02-05 08:37:19

标签: c++ qt

我试图从函数返回QLabel,但我一直收到错误:

/media/root/5431214957EBF5D7/projects/c/qt/tools/plugandpaint/plugins/extrafilters/extrafiltersplugin.cpp:17: error: could not convert ‘((const ExtraFiltersPlugin*)this)->ExtraFiltersPlugin::retLabel’ from ‘QLabel* const’ to ‘QLabel’


                ^~~~~~~~

extrafiltersplugin.h

#ifndef EXTRAFILTERSPLUGIN_H
#define EXTRAFILTERSPLUGIN_H

#include <interfaces.h>

#include <QObject>
#include <QtPlugin>
#include <QImage>
#include <QLabel>

class ExtraFiltersPlugin :
        public QObject,

        public FilterInterface,
        public RevViewsInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PlugAndPaint.FilterInterface" FILE "extrafilters.json")
    Q_INTERFACES(FilterInterface RevViewsInterface)

public:
    ExtraFiltersPlugin();

    // RevInterface
    QLabel label() const override;

private:
    QLabel *retLabel;
};

#endif

extrafiltersplugin.cpp

#include <QtWidgets>

#include <stdlib.h>

#include "extrafiltersplugin.h"

ExtraFiltersPlugin::ExtraFiltersPlugin() {
    retLabel = new QLabel();
    retLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);
    retLabel->setText("first line\nsecond line");
    retLabel->setAlignment(Qt::AlignBottom | Qt::AlignRight);
}

QLabel ExtraFiltersPlugin::label() const
{
    return retLabel;
}

我做错了什么或者错过了什么?如果这看起来非常明显,我是一个完整的C ++ / Qt新手。

提前谢谢大家。

2 个答案:

答案 0 :(得分:3)

您无法按值返回QLabel(或任何QWidget派生类的实例),因为它们无法复制。

您需要更改ExtraFiltersPlugin::label的签名,以便返回指针...

QLabel *ExtraFiltersPlugin::label () const
{
  return retLabel;
}

或参考......

QLabel &ExtraFiltersPlugin::label () const
{
  return *retLabel;
}

请注意,以上两者都允许调用者修改引用的QLabel。如果不需要(或需要),则返回类型应分别为const QLabel *const QLabel &

答案 1 :(得分:0)

标头中定义的

label()返回一个QLabel但稍后在实现中,label()返回一个指向QLabel的指针。

解决方案:

更新label()[在cpp文件中]的实现以返回QLabel对象:

QLabel ExtraFiltersPlugin::label() const { return *retLabel; }

更新ExtraFiltersPlugin :: label()的签名将不起作用,因为函数被装饰为覆盖;