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 继承!所以你不能用 QMainWindowQSyntaxHighlighter 来做。在这种情况下,双重继承在许多其他方面都很糟糕!

这里使用组合而不是聚合!