我试图从函数返回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新手。
提前谢谢大家。
答案 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()的签名将不起作用,因为函数被装饰为覆盖;