Qt抽象class作为接口
Qt abstract class as interface
我正在研究用 QT 编写的 IDE。我需要使用 QMainWindow 和 QSyntaxHighLighter classes。但是,编译时出现以下错误。
cannot declare variable 'w' to be of abstract type 'SquareSDK'
那指的是我的 main.cpp 文件。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SquareSDK w;
w.show();
return a.exec();
}
class定义在ediot.h
#ifndef EDIOT_H
#define EDIOT_H
#include <QMainWindow>
#include <QFileDialog>
#include <QtCore>
#include <QtGui>
#include <QObject>
#include <QSyntaxHighlighter>
namespace Ui {
class SquareSDK;
}
class SquareSDK : public QMainWindow, private QSyntaxHighlighter
{
Q_OBJECT
public:
explicit SquareSDK(QWidget *parent = 0);
~SquareSDK();
private slots:
void on_actionUndo_triggered();
void on_actionRedo_triggered();
void on_actionCut_triggered();
void on_actionCopy_triggered();
void on_actionPaste_triggered();
void on_actionNew_triggered();
void on_actionOpen_triggered();
void on_actionSave_triggered();
void on_actionSave_As_triggered();
void on_actionRun_in_Default_Web_Browser_triggered();
void on_actionReload_triggered();
void test();
void syntax();
private:
Ui::SquareSDK *ui;
QString mFilename;
QString urlname;
QString urldebug;
QString OS;
QString a;
QString b;
QString error;
QString ext;
QString text;
};
#endif // EDIOT_H
由于一个或两个基础 classes 有 1 个或多个 纯虚拟 方法,直到 你 在SquareSDK
中实现它们,SquareSDK
是一个抽象class(因为它字面上继承 那些纯虚方法)。 您不能实例化抽象 class。
(虽然你可以把它作为指针或引用的类型。但是它只能指向它的非抽象子classes,尽管指针类型是抽象的class。但现在这并不重要)
我查看了 QSyntaxHighlighter
的文档,它有 1 个 pure 虚拟方法。
//this is how it looks like inside QSyntaxHighlighter class
virtual void highlightBlock (const QString& text) = 0;
所以在你的 SquareSDK 中实现它:
//in .h
void highlightBlock (const QString& text);
//in .cpp
void SquareSDK::highlightBlock (const QString& text)
{
//...yourcode...
}
这是一个用于高亮块的函数,因为它是纯虚拟的,所以它绝对没有定义原始行为所以你必须完全自己编程。因此,以它 突出显示块 您希望它突出显示的方式来实现它。
幸运的是,QMainWindow
不包含 纯 虚拟方法,这让您省心了。
编辑:
继承 QSyntaxHighlighter 为 public。 highlightBlock
是受保护的,如果基 class 被继承为私有,它将变得不可访问。
Qt
中禁止双重 QObject
继承!所以你不能用 QMainWindow
和 QSyntaxHighlighter
来做。在这种情况下,双重继承在许多其他方面都很糟糕!
这里使用组合而不是聚合!
我正在研究用 QT 编写的 IDE。我需要使用 QMainWindow 和 QSyntaxHighLighter classes。但是,编译时出现以下错误。
cannot declare variable 'w' to be of abstract type 'SquareSDK'
那指的是我的 main.cpp 文件。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SquareSDK w;
w.show();
return a.exec();
}
class定义在ediot.h
#ifndef EDIOT_H
#define EDIOT_H
#include <QMainWindow>
#include <QFileDialog>
#include <QtCore>
#include <QtGui>
#include <QObject>
#include <QSyntaxHighlighter>
namespace Ui {
class SquareSDK;
}
class SquareSDK : public QMainWindow, private QSyntaxHighlighter
{
Q_OBJECT
public:
explicit SquareSDK(QWidget *parent = 0);
~SquareSDK();
private slots:
void on_actionUndo_triggered();
void on_actionRedo_triggered();
void on_actionCut_triggered();
void on_actionCopy_triggered();
void on_actionPaste_triggered();
void on_actionNew_triggered();
void on_actionOpen_triggered();
void on_actionSave_triggered();
void on_actionSave_As_triggered();
void on_actionRun_in_Default_Web_Browser_triggered();
void on_actionReload_triggered();
void test();
void syntax();
private:
Ui::SquareSDK *ui;
QString mFilename;
QString urlname;
QString urldebug;
QString OS;
QString a;
QString b;
QString error;
QString ext;
QString text;
};
#endif // EDIOT_H
由于一个或两个基础 classes 有 1 个或多个 纯虚拟 方法,直到 你 在SquareSDK
中实现它们,SquareSDK
是一个抽象class(因为它字面上继承 那些纯虚方法)。 您不能实例化抽象 class。
(虽然你可以把它作为指针或引用的类型。但是它只能指向它的非抽象子classes,尽管指针类型是抽象的class。但现在这并不重要)
我查看了 QSyntaxHighlighter
的文档,它有 1 个 pure 虚拟方法。
//this is how it looks like inside QSyntaxHighlighter class
virtual void highlightBlock (const QString& text) = 0;
所以在你的 SquareSDK 中实现它:
//in .h
void highlightBlock (const QString& text);
//in .cpp
void SquareSDK::highlightBlock (const QString& text)
{
//...yourcode...
}
这是一个用于高亮块的函数,因为它是纯虚拟的,所以它绝对没有定义原始行为所以你必须完全自己编程。因此,以它 突出显示块 您希望它突出显示的方式来实现它。
幸运的是,QMainWindow
不包含 纯 虚拟方法,这让您省心了。
编辑:
继承 QSyntaxHighlighter 为 public。 highlightBlock
是受保护的,如果基 class 被继承为私有,它将变得不可访问。
Qt
中禁止双重 QObject
继承!所以你不能用 QMainWindow
和 QSyntaxHighlighter
来做。在这种情况下,双重继承在许多其他方面都很糟糕!
这里使用组合而不是聚合!