QTextEdit之简单xml语法高亮

xml很多时候用来作为配置文件,有时为了方便在软件中查看编辑配置文件,需要一个简易的xml编辑器,qt没有提供xml语法高亮的例子,但是我们可以对着其他的例子改一个,下面是效果图:
在这里插入图片描述
xmlhighlighter.h:

#ifndef XMLHIGHLIGHTER_H
#define XMLHIGHLIGHTER_H

#include <QSyntaxHighlighter>
#include <QObject>

class XmlHighlighter : public QSyntaxHighlighter
{
    Q_OBJECT
public:
    explicit XmlHighlighter(QTextDocument *parent = nullptr);
protected:
    void highlightBlock(const QString &text);
signals:

public slots:
private:
    struct HighlightingRule
    {
        QRegExp pattern;
        QTextCharFormat format;
    };
    QVector<HighlightingRule> highlightingRules;

    QRegExp commentStartExpression;
    QRegExp commentEndExpression;
    
    QTextCharFormat multiLineCommentFormat;
    QTextCharFormat quotationFormat;
    QTextCharFormat elementNameFormat;
    QTextCharFormat propertyFormat;
};

#endif // XMLHIGHLIGHTER_H

xmlhighlighter.cpp:

#include "xmlhighlighter.h"

XmlHighlighter::XmlHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent)
{
    HighlightingRule rule;

    // 双引号
    quotationFormat.setForeground(Qt::blue);
    rule.pattern = QRegExp("\".*\"");
    rule.pattern.setMinimal(true); // 优先匹配最短的
    rule.format = quotationFormat;
    highlightingRules.append(rule);

    // 元素名
    propertyFormat.setForeground(Qt::red);
    rule.pattern = QRegExp("\\b[A-Za-z0-9_]+[\\s]*(?=\\=)");
    rule.pattern.setMinimal(true);
    rule.format = propertyFormat;
    highlightingRules.append(rule);

    // 元素名
    elementNameFormat.setForeground(Qt::blue);
    rule.pattern = QRegExp("<[\\/]*[A-Za-z0-9_]+\\b|>");
    rule.pattern.setMinimal(true);
    rule.format = elementNameFormat;
    highlightingRules.append(rule);

    // 多行注释
    multiLineCommentFormat.setForeground(Qt::darkGreen);
    commentStartExpression = QRegExp("<!--");
    commentEndExpression = QRegExp("-->");
}

void XmlHighlighter::highlightBlock(const QString &text)
{
    foreach (const HighlightingRule &rule, highlightingRules) {
        QRegExp expression(rule.pattern);
        int index = expression.indexIn(text);
        while (index >= 0) {
            int length = expression.matchedLength();
            setFormat(index, length, rule.format);
            index = expression.indexIn(text, index + length);
        }
    }

    setCurrentBlockState(0);

    // 匹配多行注释
    int startIndex = 0;
    if (previousBlockState() != 1)
        startIndex = commentStartExpression.indexIn(text);

    while (startIndex >= 0) {
        int endIndex = commentEndExpression.indexIn(text, startIndex);
        int commentLength;
        if (endIndex == -1) {
            setCurrentBlockState(1);
            commentLength = text.length() - startIndex;
        } else {
            commentLength = endIndex - startIndex
                    + commentEndExpression.matchedLength();
        }
        setFormat(startIndex, commentLength, multiLineCommentFormat);
        startIndex = commentStartExpression.indexIn(text, startIndex + commentLength);
    }
}

调用:

ui->textEdit->setTabStopWidth(ui->textEdit->fontMetrics().width(' ')*4); // tab键设为4个空格的宽度
new XmlHighlighter(ui->textEdit->document());
QTextEdit是一个常见的用于输入和编辑文本的Qt组件。根据您的问题,我可以简要地解释一下QTextEdit的拖拽功能。 QTextEdit支持两种类型的拖拽操作:拖拽进QTextEdit和从QTextEdit拖拽出去。 首先,让我们来看看拖拽进QTextEdit的情况。如果您想将一些文本或者其他可拖拽的数据拖拽到QTextEdit中,您需要先将数据设置为可拖拽的项。您可以使用QDrag类来实现这个功能。具体来说,您可以在源组件上调用QDrag开始拖拽操作,并设置要拖拽的数据。在QTextEdit中,您可以重写dragEnterEvent()和dropEvent()方法来处理拖拽操作。在dragEnterEvent()中,您可以检查拖拽的数据类型,并决定是否接受这个拖拽操作。在dropEvent()中,您可以将拖拽的数据插入到QTextEdit中。 其次,如果您想从QTextEdit拖拽出数据,您可以使用setDragEnabled()方法来启用此功能。然后您可以选择要拖拽的文本并拖动鼠标来开始拖拽操作。通过重写dragEnterEvent()和dragMoveEvent()方法,您可以确定拖拽操作是否允许,并设置拖拽的数据类型等信息。如果您希望在拖拽操作完成后执行某些操作,您可以重写dropEvent()方法。 总体而言,QTextEdit的拖拽功能提供了一种方便的方法来与其他组件或应用程序之间交换数据。通过了解QDrag和相关的事件处理方法,您可以自由地控制拖拽操作的行为和数据的传输。希望这个回答对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值