1

我有以下非常简单的 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 退出状态

重建所有和清理没有帮助。为什么链接失败?

  1. 摘要是一个不好的命名法,对不起我的不好。将其视为一个超类(不是抽象的),我从中派生出其他类。

  2. 我动态注入 MainWindow::Ui::QVBoxLayout 那些 AbstractWidget 类(例如,我有多个 SliderWidgets 和 ColorPickerWidget : public Abstractwidget 也是如此)。我只是想保持简单。

  3. 为什么派生?我有多个从 AbstractWidget 类派生的 QWidget(除了 SliderWidget)。它们都有一个 QString 名称。我想在基类 ==> AbstractWidget 中提供该名称。

  4. 为什么 virtual void setValue():每个派生类都有一些类似滑块、颜色选择器等的东西。我在每个派生类中实现了一个 setValue(QVariant),以便颜色选择器设置 QColor(QVariant::toString()),而 SliderWidget 设置带有 setValue(QVariant::toInt()) 等的滑块值。 setValue 在任何地方都是公共的(虚拟基类和派生实现)。

4

0 回答 0