无法声明QWidget,因为虚函数是纯粹的

时间:2015-05-08 17:50:59

标签: c++ qt function virtual abstract

我试图在Qt / C ++中使用接口,但我不断收到编译错误,这对我来说没有意义,因为我在派生类中实现了虚函数。所以我希望得到一些帮助:)哦是的,编译错误是"无法声明变量' 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);
 }

2 个答案:

答案 0 :(得分:3)

class Widget : public QWidget,
    public ADTType

所以Widget继承自抽象类ADTType。但是,您不能在startGame()类中声明替换(Widget等),但只能在Widget.cpp文件中定义它们。您还需要在Widget.h类标题

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

最小示例here

答案 1 :(得分:1)

您从ADTType派生了Widget抽象类,因此您需要覆盖Widget类中的纯虚函数,否则它也将变为抽象。

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