xNotepad

10 篇文章 0 订阅

xNotepad

分享一个自己写的记事本xNotepad,MDI方式,支持语法高亮、自动补全,语法高亮,批量注释,缩进、文件批量转码等功能。
点击这里下载

效果图:
这里写图片描述

文件编码

bool TextEdit::saveFileEvent(const QString &fileName)
{
    QFile file(fileName);
    bool rs = file.open(QIODevice::WriteOnly);
    if(rs){
        QTextStream out(&file);
        out.setCodec(m_codec.textCodec());
        out.setGenerateByteOrderMark(m_codec.bom());
        out<<m_textEdit->toPlainText();
        m_textEdit->document()->setModified(false);
    }
    return rs;
}

语法高亮

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

    QStringList keys;
    keys<< "char" << "class" << "const"
        << "double" << "enum" << "explicit"
        << "friend" << "inline" << "int"
        << "long" << "namespace" << "operator"
        << "private" << "protected" << "public"
        << "short" << "signals" << "signed"
        << "slots" << "static" << "struct"
        << "template" << "typedef" << "typename"
        << "union" << "unsigned" << "virtual"
        << "void" << "volatile" << "bool" << "nullptr";
    rule.format.setForeground(Qt::blue);
    for(auto& key:keys){
        rule.pattern.setPattern("\\b"+key+"\\b");
        m_highlightingRules.append(rule);
    }

    // class
    rule.pattern.setPattern("\\b(Q[A-Za-z]+|X[A-Za-z]+)\\b");
    rule.format.setForeground(Qt::darkBlue);
    m_highlightingRules.append(rule);

    // singale commet
    rule.pattern.setPattern("//[^\n]*");
    rule.format.setForeground(Qt::gray);
    m_highlightingRules.append(rule);

    rule.pattern.setPattern("#[^\n]*");
    rule.format.setForeground(Qt::gray);
    m_highlightingRules.append(rule);

    // quotation
    rule.pattern.setPattern("\".*?\"");
    rule.format.setForeground(Qt::darkGray);
    m_highlightingRules.append(rule);

    rule.pattern.setPattern("<.*?>");
    rule.format.setForeground(Qt::blue);
    m_highlightingRules.append(rule);

    // function
    rule.pattern.setPattern("\\b[A-Za-z0-9_]+(?=\\()");
    rule.format.setForeground(Qt::black);
    m_highlightingRules.append(rule);

    m_commentStartExpression.setPattern("/\\*");
    m_commentEndExpression.setPattern("\\*/");
    m_commentFormat.setForeground(Qt::gray);
}

void SyntaxHighlighter::highlightBlock(const QString &text)
{
    for(auto& rule:m_highlightingRules){
        QRegularExpressionMatchIterator matchIterator = rule.pattern.globalMatch(text);
        while (matchIterator.hasNext()) {
            QRegularExpressionMatch match = matchIterator.next();
            setFormat(match.capturedStart(), match.capturedLength(), rule.format);
        }
    }

    setCurrentBlockState(0);
    int startIndex = 0;
    if (previousBlockState() != 1)
        startIndex = text.indexOf(m_commentStartExpression);
    while (startIndex >= 0) {
        QRegularExpressionMatch match = m_commentEndExpression.match(text, startIndex);
        int endIndex = match.capturedStart();
        int commentLength = 0;
        if (endIndex == -1) {
            setCurrentBlockState(1);
            commentLength = text.length() - startIndex;
        } else {
            commentLength = endIndex - startIndex
                            + match.capturedLength();
        }
        setFormat(startIndex, commentLength, m_commentFormat);
        startIndex = text.indexOf(m_commentStartExpression, startIndex + commentLength);
    }
}

自动补全

    auto completer = new QCompleter(this);
    auto completerModel = new QStringListModel(completer);
    completerModel->setStringList(keys);
    completer->setModel(completerModel);
    //completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel);
    completer->setCaseSensitivity(Qt::CaseInsensitive);
    completer->setWrapAround(false);
    m_textEdit->setCompleter(completer);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值