【Qt开发流程】之自定义语法高亮和使用HTML语法

描述

语法高亮(Syntax Highlighting)是一种在编辑器中突出显示代码语法元素的技术,使其更易于阅读和理解。
Qt提供了一个功能齐全的语法高亮框架,支持多种语言和格式,可以自定义颜色和样式。
对于使用Qt的开发人员来说,实现语法高亮是一个相对简单的过程。

HTML(HyperText Markup Language)是一种用于创建Web页面的标记语言,Qt也提供了一个用于显示HTML内容的类QTextBrowser。QTextBrowser类允许你将HTML内容显示在窗口中,并且支持基本的CSS样式。

相关的类包括QSyntaxHighlighter类QTextBrowser类

QSyntaxHighlighter类是用于实现语法高亮的类,可以通过继承该类并重新实现highlightBlock()函数来实现自定义语法高亮。该类也提供了一些常用的语法高亮规则,包括注释、字符串、数字、关键字等。

QSyntaxHighlighter类

QSyntaxHighlighter类允许定义语法高亮显示规则,此外还可以使用该类查询文档的当前格式或用户数据。
QSyntaxHighlighter类是实现QTextDocument语法荧光笔的基类。语法高亮器会自动高亮显示QTextDocument中的部分文本。当用户输入特定格式的文本(例如源代码)时,通常使用语法高亮显示,帮助用户阅读文本并识别语法错误。
要提供自己的语法高亮显示,必须创建QSyntaxHighlighter的子类并重新实现highlightBlock()
当创建QSyntaxHighlighter子类的实例时,将希望应用语法高亮的QTextDocument传递给它。例如:

  QTextEdit *editor = new QTextEdit;
  MyHighlighter *highlighter = new MyHighlighter(editor->document());

在此之后,highlightBlock()函数将在必要时自动调用。使用highlightBlock()函数对传递给它的文本应用格式(例如设置字体和颜色)。QSyntaxHighlighter提供了setFormat()函数,该函数在当前文本块上应用给定的QTextCharFormat。例如:

  void MyHighlighter::highlightBlock(const QString &text)
  {
      QTextCharFormat myClassFormat;
      myClassFormat.setFontWeight(QFont::Bold);
      myClassFormat.setForeground(Qt::darkMagenta);

      QRegularExpression expression("\\bMy[A-Za-z]+\\b");
      QRegularExpressionMatchIterator i = expression.globalMatch(text);
      while (i.hasNext())
      {
        QRegularExpressionMatch match = i.next();
        setFormat(match.capturedStart(), match.capturedLength(), myClassFormat);
      }
  }

有些语法可以具有跨越多个文本块的结构。例如,c++语法高亮笔应该能够处理//多行注释。要处理这些情况,有必要知道前一个文本块的结束状态(例如:"in comment")。
highlightBlock()实现中,可以使用previousBlockState()函数查询前一个文本块的结束状态。解析完块后,可以使用setCurrentBlockState()保存最后一个状态。
currentBlockState()previousBlockState()函数返回一个int值。如果未设置状态,则返回值为-1。可以使用setCurrentBlockState()函数指定任何其他值来标识任何给定的状态。一旦状态被设置,QTextBlock将保持该值,直到它被再次设置或直到相应的文本段落被删除。
例如,如果你正在编写一个简单的c++语法高亮显示,你可以指定1来表示“in comment”:

  QTextCharFormat multiLineCommentFormat;
  multiLineCommentFormat.setForeground(Qt::red);

  QRegularExpression startExpression("/\\*");
  QRegularExpression endExpression("\\*/");

  setCurrentBlockState(0);

  int startIndex = 0;
  if (previousBlockState() != 1)
      startIndex = text.indexOf(startExpression);

  while (startIndex >= 0) {
     QRegularExpressionMatch endMatch;
     int endIndex = text.indexOf(endExpression, startIndex, &endMatch);
     int commentLength;
     if (endIndex == -1) {
         setCurrentBlockState(1);
         commentLength = text.length() - startIndex;
     } else {
         commentLength = endIndex - startIndex
                         + endMatch.capturedLength();
     }
     setFormat(startIndex, commentLength, multiLineCommentFormat);
     startIndex = text.indexOf(startExpression,
                               startIndex + commentLength);
  }

在上面的例子中,我们首先将当前块状态设置为0。然后,如果前一个块以注释结束,则从当前块的开头突出显示(startIndex = 0),否则,搜索给定的开始表达式。如果在文本块中找不到指定的结束表达式,我们通过调用setCurrentBlockState()来改变当前块状态,并确保块的其余部分突出显示。
此外,您可以分别使用format()和currentBlockUserData()函数查询当前格式化和用户数据。您还可以使用setCurrentBlockUserData()函数将用户数据附加到当前文本块。QTextBlockUserData可用于存储自定义设置。在语法高亮的情况下,它特别有趣,因为它可以缓存您在解析段落文本时发现的信息。例如,请参阅setCurrentBlockUserData()文档。

void QSyntaxHighlighter::setCurrentBlockUserData(QTextBlockUserData *data):

将给定的数据附加到当前文本块。所有权传递给底层文本文档,即提供的QTextBlockUserData对象将被删除,如果相应的文本块被删除。
QTextBlockUserData可用于存储自定义设置。在语法高亮的情况下,它特别有趣,因为它可以缓存您在解析段落文本时发现的信息。
例如,在解析文本时,您可以跟踪您遇到的括号字符('{[('之类的)),并将它们的相对位置和实际的QChar存储在从QTextBlockUserData派生的简单类中:

  struct ParenthesisInfo
  {
      QChar char;
      int position;
  };

  struct BlockData : public QTextBlockUserData
  {
      QVector<ParenthesisInfo> parentheses;
  };

在关联编辑器中的光标导航期间,您可以询问当前QTextBlock(使用QTextCursor::block()函数检索)是否具有用户数据对象集,并将其强制转换为BlockData对象。然后,您可以检查当前光标位置是否与先前记录的圆括号位置匹配,并根据圆括号的类型(开始或结束)查找同一级别上的下一个开始或结束圆括号。
通过这种方式,您可以进行可视化的括号匹配,并从当前光标位置突出显示到匹配的括号。这使得在编辑括号密集的代码时,更容易发现代码中缺少的括号,并找到相应的开/闭括号。

QSyntaxHighlighter示例

下面是一个简单的示例,演示如何使用QSyntaxHighlighter来实现C++代码的语法高亮。

#include <QSyntaxHighlighter>
#include <QTextCharFormat>
#include <QRegularExpression>
class CppHighlighter : public QSyntaxHighlighter
{
public:
    CppHighlighter(QTextDocument* parent = nullptr) : QSyntaxHighlighter(parent)
    {
        HighlightRule rule;

        rule.pattern = QRegularExpression("//[^\n]*");
        rule.format.setForeground(Qt::darkGreen);
        m_rules.append(rule);

        rule.pattern = QRegularExpression("\"[^\"]*\"");
        rule.format.setForeground(Qt::red);
        m_rules.append(rule);

        rule.pattern = QRegularExpression("\\b[0-9]+\\b");
        rule.format.setForeground(Qt::blue);
        m_rules.append(rule);

        rule.pattern = QRegularExpression("\\b(void|int|float|double|char|bool)\\b");
        rule.format.setForeground(Qt::darkMagenta);
        m_rules.append(rule);
    }

protected:
    void highlightBlock(const QString& text) override
    {
        for (const HighlightRule& rule : m_rules) {
            QRegularExpressionMatchIterator it = rule.pattern.globalMatch(text);
            while (it.hasNext()) {
                QRegularExpressionMatch match = it.next();
                setFormat(match.capturedStart(), match.capturedLength(), rule.format);
            }
        }
    }

private:
    struct HighlightRule
    {
        QRegularExpression pattern;
        QTextCharFormat format;
    };

    QVector<HighlightRule> m_rules;
};

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QPlainTextEdit editor;
    CppHighlighter highlighter(editor.document());
    editor.show();

    return app.exec();
}
  • 结果

在这里插入图片描述

HTML

QTextBrowser类是一个用于显示HTML内容的控件,具有基本的浏览器功能,如链接、样式、图像等。该控件支持标准的HTML 4.0语法和基本的CSS样式。

示例:

#include <QApplication>
#include <QTextBrowser>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QTextBrowser browser;
    browser.setHtml("<h1>Hello World!</h1>");
    browser.show();

    return app.exec();
}

在这里插入图片描述

结论

人生就像一杯水,孤独,孤独,孤独,一辈子就完了

  • 40
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
语法高亮 HighlightTextEditor是一个安卓代码语法高亮控件,目前已经支持200多种语言,近90多种主题配色方案,同时支持lua扩展,以及自定义语言配置。强烈推荐,一款不可多得的开源控件。 支持的语言: abap4.lang clojure.lang innosetup.lang nxc.lang s.lang abc.lang clp.lang interlis.lang oberon.lang sas.lang abnf.lang cobol.lang io.lang objc.lang scala.lang actionscript.lang coldfusion.lang jasmin.lang ocaml.lang scilab.lang ada.lang conf.lang java.lang octave.lang scss.lang agda.lang crk.lang js.lang oorexx.lang sh.lang algol.lang csharp.lang jsp.lang os.lang small.lang ampl.lang css.lang ldif.lang oz.lang smalltalk.lang amtrix.lang d.lang less.lang paradox.lang sml.lang applescript.lang dart.lang lhs.lang pas.lang snmp.lang arc.lang diff.lang lilypond.lang pdf.lang snobol.lang arm.lang dylan.lang limbo.lang perl.lang spec.lang as400cl.lang ebnf.lang lindenscript.lang php.lang spn.lang ascend.lang eiffel.lang lisp.lang pike.lang sql.lang asp.lang erlang.lang logtalk.lang pl1.lang squirrel.lang aspect.lang euphoria.lang lotos.lang plperl.lang styl.lang assembler.lang express.lang lotus.lang plpython.lang swift.lang ats.lang fame.lang lua.lang pltcl.lang sybase.lang autohotkey.lang felix.lang luban.lang pov.lang tcl.lang autoit.lang fortran77.lang make.lang pro.lang tcsh.lang avenue.lang fortran90.lang maple.lang progress.lang tex.lang awk.lang frink.lang matlab.lang ps.lang ts.lang bat.lang fsharp.lang maya.lang ps1.lang
### 回答1: Qt Creator是一款非常流行的集成开发环境,它专门用于开发HMI(Human Machine Interface,人机界面)应用程序。Qt Creator提供了丰富的工具和功能,使开发者能够轻松地创建各种各样的HMI界面。 首先,Qt Creator拥有直观易用的图形用户界面设计器。开发者可以通过可视化地拖拽和放置控件,快速生成界面布局。界面设计器支持多种常用的控件,如按钮、标签、输入框等,同时也能够自定义控件的属性、排列方式和样式。 其次,Qt Creator提供了强大的代码编辑器。开发者可以使用C++或Qt语言编写HMI应用程序的逻辑代码。代码编辑器具备代码自动补全、语法高亮、代码导航等功能,能够提高开发效率和准确性。 此外,Qt Creator还集成了调试器和分析工具。开发者可以使用调试器跟踪和排查代码中的错误,并对代码进行性能分析和优化。这些工具能够帮助开发者快速定位和解决问题,提升应用程序的质量和性能。 最后,Qt Creator支持多平台开发开发者可以使用Qt Creator在各种操作系统上创建HMI应用程序,包括Windows、Linux和macOS等。这为开发者提供了更大的灵活性和可扩展性,使其能够满足不同平台的需求。 总结来说,Qt Creator作为一款专门用于开发HMI的集成开发环境,具备可视化界面设计、强大的代码编辑、调试和分析工具,以及多平台支持等特点。它为开发者提供了丰富的功能和工具,使其能够快速、高效地开发各种各样的HMI应用程序。 ### 回答2: Qt Creator是一个开发工具,适用于Qt框架的应用程序开发。HMI(Human-Machine Interface,人机界面)是一种与用户进行交互的软件界面,常用于工业控制、嵌入式系统等领域。 Qt Creator提供了丰富的功能,使开发人员能够轻松地开发HMI。首先,Qt Creator提供了可视化界面设计工具,开发人员可以通过拖放的方式设计界面元素,如按钮、文本框等。同时,Qt Creator提供了丰富的界面控件库,开发人员可以根据需要选择合适的控件来构建HMI界面,从而实现用户与系统的交互。 其次,Qt Creator提供了强大的代码编辑功能。开发人员可以使用C++语言以及Qt框架的API来编写HMI的逻辑代码。Qt Creator提供了代码补全、语法高亮等功能,简化了代码编写的过程。同时,Qt Creator还集成了调试工具,方便开发人员进行调试和错误排查。 另外,Qt Creator提供了丰富的工具和插件,帮助开发人员更高效地开发HMI。例如,Qt Designer可以用于自定义界面控件的样式、外观等。Qt Linguist可以用于多语言的支持,使得开发人员可以方便地进行国际化和本地化。此外,Qt Creator还支持版本控制、项目管理等功能,使开发过程更加顺畅。 总之,Qt Creator提供了丰富的功能和工具,使开发人员能够方便地开发HMI。借助于其可视化界面设计、强大的代码编辑和调试功能,开发人员可以更快速地开发出高质量的HMI应用程序。 ### 回答3: Qt Creator是一个跨平台的集成开发环境(IDE),用于开发基于Qt框架的应用程序。它具有丰富的功能和用户友好的界面,能够加速HMI(人机界面)开发过程。 首先,Qt Creator提供了一套强大的工具和组件,用于设计和构建HMI。它支持多种常用的HMI元素,如按钮、文本框、图表、菜单等,以及丰富的样式和布局选项,使得开发者能够轻松地创建各种各样的用户界面。 其次,Qt Creator内置了用于编写和调试代码的功能。它支持多种编程语言,如C++、QML等,使开发者能够根据项目需求选择最合适的语言进行开发。同时,Qt Creator提供了实时错误检查、自动完成、调试器等功能,可以帮助开发者提高开发效率和代码质量。 此外,Qt Creator还提供了一些用于集成和部署的工具。开发者可以使用Qt Creator内置的版本管理工具进行版本控制,方便多人协作开发。同时,它还支持将应用程序打包为可执行文件或库,以便在不同平台上部署和使用。 总之,Qt Creator是一个功能强大且易于使用开发工具,非常适合用于HMI开发。它提供了丰富的功能和灵活的界面设计,帮助开发者快速创建专业水平的用户界面。同时,它还提供了强大的编码和调试功能,使得开发者能够高效地开发和维护HMI应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FreeLikeTheWind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值