基于QScintilla项目实现SQL编辑器

1、下载QScintilla:
https://www.riverbankcomputing.com/static/Downloads/QScintilla/2.14.1/QScintilla_src-2.14.1.zip

 

2、解压缩,目录结构如下:

QScintilla_src-2.14.1
  - src 组件源代码
  - qsci 组件头文件
  - scintilla 内置的各种语言的词法扫描源代码
  - example 范例(用不到)
  - doc 文档(用不到)
  - Python 为Python提供的封装(用不到)
  - designer 为QT设计器注册QScintilla控件(用不到)

 编译QScintilla只会用到前三个目录(src、qsci、scintilla)。

 

3、用QT(5.14.2)打开QScintilla工程。
工程文件:QScintilla_src-2.14.1/src/qscintilla.pro

 

4、构建QScintilla工程,分别用debug和release两种模式构建。

build-qscintilla-Desktop_Qt_5_14_2_MinGW_64_bit-Debug
----debug/libqscintilla2_qt5d.a
----debug/qscintilla2_qt5d.dll
build-qscintilla-Desktop_Qt_5_14_2_MinGW_64_bit-Release
----release/libqscintilla2_qt5.a
----release/qscintilla2_qt5.dll

 

5、创建一个Demo工程,比如:QScintillaDemo
在QScintillaDemo目录下创建一个lib目录,把第4步生成的库文件拷贝过去,目录结构如下:

QScintillaDemo/lib/QScintilla
----/debug/qscintilla2_qt5d.a
----/debug/qscintilla2_qt5d.dll
----/release/qscintilla2_qt5.a
----/release/qscintilla2_qt5.dll
----/include/Qsci/*.h

 

6、在工程文件QScintillaDemo.pro中添加如下配置:

# QScintilla
INCLUDEPATH += $$PWD/lib/QScintilla/include
DEPENDPATH += $$PWD/lib/QScintilla/include
debug {
    LIBS += -L$$PWD/lib/QScintilla/debug -lqscintilla2_qt5d
}
release {
    LIBS += -L$$PWD/lib/QScintilla/release -lqscintilla2_qt5
}

 

7、修改主窗口类MainWindow的源代码,使用QScintilla编辑器。

MainWindow窗口类的头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QsciScintilla;

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);

private:
    QsciScintilla *textEdit;
};
#endif // MAINWINDOW_H

MainWindow窗口类的源代码文件:

#include "mainwindow.h"

#include "Qsci/qsciscintilla.h"
#include "Qsci/qscilexersql.h"
#include "Qsci/qsciapis.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow{parent}
{
    resize(800, 480);

    textEdit = new QsciScintilla;
    setCentralWidget(textEdit);

    //语法高亮
    QsciLexerSQL* textLexer = new QsciLexerSQL(this);
    textEdit->setLexer(textLexer);

    //文档中出现的单词支持自动补全
    textEdit->setAutoCompletionSource(QsciScintilla::AcsAll);
    textEdit->setAutoCompletionCaseSensitivity(false);
    textEdit->setAutoCompletionThreshold(1);

    //常用关键字支持自动补全
    QsciAPIs *apis = new QsciAPIs(textLexer);
    apis->add(QString("select"));
    apis->add(QString("from"));
    apis->add(QString("left"));
    apis->add(QString("right"));
    apis->add(QString("full"));
    apis->add(QString("join"));
    apis->add(QString("on"));
    apis->add(QString("where"));
    apis->add(QString("and"));
    apis->add(QString("or"));
    apis->add(QString("not"));
    apis->add(QString("between"));
    apis->add(QString("exists"));
    apis->add(QString("group"));
    apis->add(QString("by"));
    apis->add(QString("order"));
    apis->add(QString("limit"));
    apis->add(QString("offset"));
    apis->prepare();

    //设置编码为UTF-8
    textEdit->SendScintilla(QsciScintilla::SCI_SETCODEPAGE, QsciScintilla::SC_CP_UTF8);

    //左侧显示行号
    textEdit->setMarginLineNumbers(0, true);
    textEdit->setMarginWidth(0, 20);

    //TAB缩进4个字符
    textEdit->setTabWidth(4);

    //当前行高亮
    textEdit->setCaretLineVisible(true);
    textEdit->setCaretLineBackgroundColor(QColor("#E8E8FF"));

    //折叠样式
    textEdit->setFolding(QsciScintilla::BoxedTreeFoldStyle);
}

 

最后,构建Demo程序,运行效果如下:

 

posted @ 2024-01-31 23:03  卡卡西村长  阅读(85)  评论(0编辑  收藏  举报