0

我有一个问题:我的项目是一个非常简单的带有 QTextEdit 和 QSyntaxHighlighter 的项目,我正在尝试加载一个 .cpp 文件并仅突出显示该文件的第八行,但如果 QTextEdit 无法加载整个文件我要求它突出显示这条线。

下图显示了问题:

在此处输入图像描述

该应用程序的相关代码如下:

void MainWindow::openFile(const QString &path)
{
    QString fileName = path;

    if (fileName.isNull())
        fileName = QFileDialog::getOpenFileName(this,
            tr("Open File"), "", "C++ Files (*.cpp *.h)");

    if (!fileName.isEmpty()) {
        QFile file(fileName);
        if (file.open(QFile::ReadOnly | QFile::Text))
            editor->setPlainText(file.readAll());

        QVector<quint32> test;
        test.append(8); // I want the eighth line to be highlighted
        editor->highlightLines(test);
    }
}

#include "texteditwidget.h"

TextEditWidget::TextEditWidget(QWidget *parent) :
    QTextEdit(parent)
{
    setAcceptRichText(false);
    setLineWrapMode(QTextEdit::NoWrap);

}



// Called to highlight lines of code
void TextEditWidget::highlightLines(QVector<quint32> linesNumbers)
{

    // Highlight just the first element
    this->setFocus();
    QTextCursor cursor = this->textCursor();
    cursor.setPosition(0);
    cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, linesNumbers[0]);
    this->setTextCursor(cursor);
    QTextBlock block = document()->findBlockByNumber(linesNumbers[0]);
    QTextBlockFormat blkfmt = block.blockFormat();
    // Select it
    blkfmt.setBackground(Qt::yellow);
    this->textCursor().mergeBlockFormat(blkfmt);
}

但是,如果您想使用我使用的 cpp 文件(在 FileToOpen\diagramwidget.cpp 目录中)测试项目,这里是完整的源代码

http://idsg01.altervista.org/QTextEditProblem.zip

我已经尝试解决这个问题很长时间了,我开始怀疑这是否不是错误或类似的东西

4

2 回答 2

1

QTextEdit不能一次接受这么多的文字。拆分它,例如这样:

if (!fileName.isEmpty()) {
    QFile file(fileName);
    if (file.open(QFile::ReadOnly | QFile::Text))
    {
        QByteArray a = file.readAll();

        QString s = a.mid(0, 3000);//note that I split the array into pieces of 3000 symbols.
        //you will need to split the whole text like this. 
        QString s1 = a.mid(3000,3000);

        editor->setPlainText(s);
        editor->append(s1);
    }
于 2012-07-31T15:47:09.207 回答
0

似乎 QTextEdit 控件在每次加载后都需要时间,设置一个QApplication:processEvents();aftersetPlainText()可以解决问题,尽管它不是一个优雅的解决方案。

于 2012-07-31T17:08:29.457 回答