我有以下非常简单的 Qt项目:
我有
#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&)”的引用
collect2.exe:-1: Fehler: 错误: ld 返回 1 退出状态
重建所有和清理没有帮助。为什么链接失败?
摘要是一个不好的命名法,对不起我的不好。将其视为一个超类(不是抽象的),我从中派生出其他类。
我动态注入 MainWindow::Ui::QVBoxLayout 那些 AbstractWidget 类(例如,我有多个 SliderWidgets 和 ColorPickerWidget : public Abstractwidget 也是如此)。我只是想保持简单。
为什么派生?我有多个从 AbstractWidget 类派生的 QWidget(除了 SliderWidget)。它们都有一个 QString 名称。我想在基类 ==> AbstractWidget 中提供该名称。
为什么 virtual void setValue():每个派生类都有一些类似滑块、颜色选择器等的东西。我在每个派生类中实现了一个 setValue(QVariant),以便颜色选择器设置 QColor(QVariant::toString()),而 SliderWidget 设置带有 setValue(QVariant::toInt()) 等的滑块值。 setValue 在任何地方都是公共的(虚拟基类和派生实现)。