左键单击时QT QTextBrowser禁用写入位置

Posted

技术标签:

【中文标题】左键单击时QT QTextBrowser禁用写入位置【英文标题】:QT QTextBrowser disable write position when left-click 【发布时间】:2018-09-02 23:34:20 【问题描述】:

我正在编写一个包含QTextBrowser 的QT 应用程序。

当应用程序执行某些功能时,该功能会打印QTextBrowser 中的行,并且在写入行期间,如果我在QTextBrowser 上的任何打印行上按下鼠标左键,则应用程序会重新开始打印我按下的行中的行开。

如何预防?

例子:

所有函数输出:

设备用户:xvalid 1

设备型号:alpha 16

设备名称:Samsoni

工作阶段:16级

在打印行期间,如果我用鼠标左键按下第二行,就会发生这种情况:

设备用户:xvalid 1

设备型号:alpha 16 设备名称:Samsoni

工作阶段:16级

如您所见,应用程序将从我按下的位置重新设置开始写入点

【问题讨论】:

试试:setReadOnly(true); 这个选项只是为了防止用户删除没有解决问题的行 那是minimal reproducible example 吗?你读过链接吗? 好吧,在这种情况下,主要是问题是由inserthtml()引起的。另一方面,MCVE 不需要太多时间,看看我的解决方案,它实际上是一个 MCVE。我无需您的编辑即可理解该问题,但问题是如果您不指出您正在使用 insertHtml(),我无法重现它,因此提供 MCVE 很重要。 @John,理解这个问题可能就足够了,但是强迫每个愿意帮助创建测试示例以尝试重现您的问题的人不知何故并不好,只是因为您没有不想花时间自己做。 【参考方案1】:

文档表明,当您使用 insertHtml() 时,它类似于:

edit->textCursor().insertHtml(fragment);

也就是说,HTML被添加到光标所在的位置,当你用鼠标按下时,光标移动到你点击的位置。

解决方法是将光标移到末尾:

QTextCursor cursor = your_QTextBrowser->textCursor(); // get current cursor
cursor.movePosition(QTextCursor::End); // move it to the end of the document
cursor.insertHtml(text); // insert HTML

例子:

#include <QApplication>
#include <QTextBrowser>
#include <QTimer>

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    QTextBrowser w;
    int counter = 0;

    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, [&w, &counter]()
        QString text = QString::number(counter);
        // at html
        QTextCursor cursor = w.textCursor();
        cursor.movePosition(QTextCursor::End);
        cursor.insertHtml(text);
        counter++;
    );
    timer.start(1000);
    w.show();
    return a.exec();

【讨论】:

@John 那么这意味着我们需要一个 MCVE,我试图重现你的问题但我不能,原因很明显:我不知道你是如何实现你的代码的,查询正在使用cursor.insertHtml(text);,不是your_QTextBrowser-&gt;insertHtml(text)。无论如何,如果您需要帮助,就必须努力工作并提供像样的minimal reproducible example :) 非常感谢,通过添加这些代码 QTextCursor cursor = your_QTextBrowser-&gt;textCursor(); cursor.movePosition(QTextCursor::End); cursor.insertHtml(text); 而不是 textbrowser-&gt;inserthtml 解决了问题 @John 那是我的解决方案,我很好奇,当你说:很遗憾没有解决问题你试过什么代码? 我只添加了这些QTextCursor cursor = your_QTextBrowser-&gt;textCursor(); // get current cursor cursor.movePosition(QTextCursor::End); // move it to the end of the document并添加了textsbrowser-&gt;inserthtml而不是cursor.inserthtml,这是我的错误,再次感谢 @John 这是我的怀疑,在我的答案中使用它之前分析答案,不仅放代码,而且我花时间来维持它。

以上是关于左键单击时QT QTextBrowser禁用写入位置的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 如何使 QTextBrowser 调整为内容(垂直布局)

Qt入门系列开发教程基础控件篇QTextBrowser文本浏览控件

QTextBrowser / C++ 附加可点击文本

qt 标签 QTextBrowser QLabel

QTextBrowser:如何突出显示单击的行

鼠标左键单击的脚本vbscript