我正在尝试使用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);
 }

最佳答案

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

关于c++ - 由于虚函数是纯函数,因此无法声明QWidget,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30129894/

10-13 07:22