我遵循非常简单的Qt project:
我有
#ifndef ABSTRACTWIDGET_H
#define ABSTRACTWIDGET_H
#include <QWidget>
#include <QVariant>
namespace Ui {
class AbstractWidget;
}
class AbstractWidget : public QWidget
{
Q_OBJECT
public:
explicit AbstractWidget(const QString &name, QWidget *parent = 0);
~AbstractWidget();
QString getName();
virtual void setValue(const QVariant & value);
protected:
Ui::AbstractWidget *ui;
};
#endif // ABSTRACTWIDGET_H
和
#ifndef SLIDERWIDGET_H
#define SLIDERWIDGET_H
#include "abstractwidget.h"
#include <QSlider>
class SliderWidget : public AbstractWidget
{
Q_OBJECT
public:
explicit SliderWidget(const QString & name, int min, int max, QWidget *parent = 0);
~SliderWidget();
void setValue(const QVariant & value);
private:
QSlider * slider;
};
#endif // SLIDERWIDGET_H
我刚刚在超类Abstractwidget上创建了setValue虚拟,它丢弃了以下链接器错误:
moc_abstractwidget.cpp:-1:Fehler:未定义引用 `AbstractWidget :: setValue(QVariant const&amp;)'
collect2.exe:-1:Fehler:错误:ld返回1退出状态
重建所有并清理没有帮助。为什么没有链接?
抽象是一个糟糕的命名,对不起我的坏。将它视为一个超类(非抽象),我从中派生出其他类。
我在MainWindow :: Ui :: QVBoxLayout中动态注入那些AbstractWidget类(例如我有多个SliderWidgets和ColorPickerWidget:public Abstractwidget)。我只是想保持简单。
为什么要派生?我有多个QWidgets(除了SliderWidget)派生自AbstractWidget类。它们都有一个QString名称。我想在基类中提供该名称==&gt; AbstractWidget。
为什么virtual void setValue():每个派生类都有类似滑块,颜色选择器等的东西。我在每个派生类中实现一个setValue(QVariant),以便colorpicker设置QColor(QVariant :: toString()并且SliderWidget用setValue(QVariant :: toInt())等设置sliderValue。 setValue在任何地方都是公共的(虚拟基类和派生实现)。