不能声明 QWidget 因为虚函数是纯的

Cant declare a QWidget because virtual functions are pure

我正在尝试使用 Qt/C++ 中的接口,但我一直收到编译错误,这对我来说毫无意义,因为我已经在派生的 [=32] 中实现了虚函数=].所以我希望得到一些帮助:)哦,是的,编译错误是“无法将变量 'w' 声明为抽象类型 'Widget' 因为以下虚函数在 'Widget' 中是纯函数: startGame(), getBoard(), gameFinished().

Main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

ADTType.h

#ifndef ADTTYPE_H
#define ADTTYPE_H
class ADTType
{
public:
    virtual void startGame() = 0;
    virtual void getBoard() = 0;
    virtual void gameFinished() = 0;
    virtual ~ADTType() {}
};
Q_DECLARE_INTERFACE(ADTType, "ADTType")
#endif // ADTTYPE_H

Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSignalMapper>
#include <QHBoxLayout>
#include <QPushButton>
#include "ADTType.h"

class Widget : public QWidget,
        public ADTType
{
    Q_OBJECT
    Q_INTERFACES(ADTType)

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    QHBoxLayout * mainLayout;
    QPushButton * startButton;
    QPushButton * buttons[10];
    QSignalMapper * map;
};
#endif // WIDGET_H

Widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{}

Widget::~Widget()
{}
void Widget::startGame() {
    for (int i = 0; i < 10; i++) {
             buttons[i]->setStyleSheet("QPushButton {background-color: normal}");
    }
    setButtons(true);
    startButton->setDisabled(true);
}

void Widget::getBoard() {

    bool * cells = game->getCells();
    for (int i = 0; i < 10; i++) {
        if (!cells[i]) {
             buttons[i]->setStyleSheet("QPushButton {background-color: red}");
             buttons[i]->setEnabled(false);
        }
    }
}

void Widget::gameFinished() {

    int answer = game->getAnswer();
    buttons[answer]->setStyleSheet("QPushButton {background-color: green}");
    setButtons(false);
    game->reset();
    QMessageBox::information(this,tr("Finito"),tr("You found it."),
                             QMessageBox::Ok);
    startButton->setEnabled(true);
 }
class Widget : public QWidget,
    public ADTType

所以Widget继承自抽象classADTType。但是,您没有在 Widget class 中声明覆盖(startGame() 等),而是仅在 Widget.cpp 文件中定义它们。您还需要在 Widget.h class header

中声明它们
// need these declarations inside the class Widget in Widget.h
virtual void startGame();
virtual void getBoard();
virtual void gameFinished(); 

最小示例here

你从Widget派生了ADTType抽象class所以你需要覆盖Widgetclass中的纯虚函数否则它也会变成摘要.

class Widget : public QWidget,
     public ADTType
{
  ...
  void startGame() { ... }
  void getBoard() { ... }
  void gameFinished() { ... }
};