【问题标题】:QTextEdit delete whole line at given positionQTextEdit在给定位置删除整行
【发布时间】:2015-03-05 01:54:04
【问题描述】:

我需要从程序中手动删除 QTextEdit 中的特定行(NoWrap 选项处于活动状态)。我找到了一个解释如何删除第一行的解决方案,但我想知道如何在特定索引处删除整行。

我也在这里找到了解决方案 Remove a line/block from QTextEdit ,但我不知道这些块是什么。它们是否代表单行?我应该遍历这些块,如果我到达给定索引处的块,然后删除它?

【问题讨论】:

  • 根据Qt文档,block =段落。虽然您提到的问题的标题可能令人困惑,但提问者确实提到了“在我的特定情况下,一个块 = 一行”。
  • 好的,所以当 NoWrap 选项对行启用时,块 = 段落 = 行,对吗?
  • 是的,你可以这么说。
  • 有问题的死链接。请更新或删除。(developer.nokia.com/community/discussion/showthread.php/…)

标签: c++ qt user-interface text qt5


【解决方案1】:

您可以使用以下命令删除lineNumer 处的行:

QTextCursor cursor = textEdit->textCursor();

cursor.movePosition(QTextCursor::Start);
cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, lineNumer);
cursor.select(QTextCursor::LineUnderCursor);
cursor.removeSelectedText();
cursor.deleteChar(); // clean up new line

textEdit->setTextCursor(cursor);

这里你把光标放在文档的开头,向下移动lineNumer次,选择特定的行并删除它。

【讨论】:

  • 明智的做法是在这段时间内禁用光标,这样按钮按下或鼠标点击就不会干扰。可能性很小,但可能是危险的。
  • 不错!虽然我觉得QTextCursor cursor = ui->textEdit->textCursor(); cursor.select(QTextCursor::LineUnderCursor); cursor.removeSelectedText(); 足以胜任这项工作。
  • 只要没有多个线程与 GUI 交互,就不应该出现在执行序列的过程中可以更改光标的情况。 Qt会在事件循环中处理用户事件
【解决方案2】:

您可以执行以下操作:

QTextEdit te;
// Three lines in the text edit
te.setText("Line 1\nLine 2\nLine 3");

const int lineToDelete = 1; // To delete the second line.
QTextBlock b = te.document()->findBlockByLineNumber(lineToDelete);
if (b.isValid()) {
    QTextCursor cursor(b);
    cursor.select(QTextCursor::BlockUnderCursor);
    cursor.removeSelectedText();
}

【讨论】:

    【解决方案3】:

    我知道这个问题已经被接受,而且在这里已经完全死了,但我将假设我在QTextEdit 上的经历,作为对后面的人的警告。

    我的问题空间类似于 OP,因为我想从文本编辑中删除一行。我按照这里给定的解决方案,稍微改进了一下,最终相信我已经找到了成功。

    然而,只有在查看文本编辑时,或者在整个程序过程中它至少出现在屏幕上一次时,才能实现这种成功。虽然我无法确认这一点,但我相信这与光标操作有关。

    这里有更深入的解释:

    我希望在UI 和它正在与之交谈的远程单元之间创建消息历史记录。消息将采用颜色编码,一个用于UI 发送的消息,另一个用于接收的消息。为了防止大量内存影响,我们的想法是将行数限制为特定数量,例如1000

    我的原始代码很像接受的答案:

    • 如果行数超过我的设定值,请将光标移到开头并删除第一行。

    然而,过了一段时间,我开始注意到程序的运行时执行速度变慢了。添加调试后,我发现,只要我没有实际查看文本发送到的位置,行限制器就不会真正删除行。文本发送到的QTextEdit 位于选项卡式小部件中。这意味着我必须循环到该选项卡,否则算法将无法工作。

    这是我的问题空间的有效解决方案:

    void ScrollingEdit::append(QString text, QColor color)
    {
        QString pc = QString("<body style=\"color:rgb(%1,%2,%3);\">").
            arg(color.red()).arg(color.green()).arg(color.blue());
        QString ac = QString("</body>");
    
        text.prepend( pc );
        text.append( ac );
    
        mText.append( text );
    
        QString delim = "</body>";
    
        if ( mText.count( delim ) > mMaxLine )
        {
            mText.remove(0, mText.indexOf( delim ) + delim.size() );
        }
    
        mEdit->clear();
        mEdit->setHtml( mText );
    
        QTextCursor cursor = mEdit->textCursor();
    
        cursor.movePosition( QTextCursor::End );
    
        mEdit->setTextCursor(cursor);
        mEdit->ensureCursorVisible();
    }
    

    其中mText 是成员变量QString,充当文本编辑的“模型”,mMaxLine 是用户可配置的int,用于设置允许的最大行数,mEditUIQTextEdit。请注意,光标操作仍然存在,但重要的是用户查看元素的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2018-03-11
      • 2017-01-24
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多