【问题标题】:Qt 5.3 QPlainTextEdit implement scroll lock [duplicate]Qt 5.3 QPlainTextEdit 实现滚动锁定
【发布时间】:2014-09-09 15:04:40
【问题描述】:

我正在使用 Qt 5.3 和基于 QPlainTextEdit 的小部件。我一直在上面附加/插入文本。如果我手动滚动内容,我想锁定滚动,因此屏幕保持在同一位置(内容继续被附加/插入)。我通过定位光标并使用 insertText/appendText 在组件上附加/插入文本:

this->cursor.insertText(text, this->format);

有什么想法吗?

【问题讨论】:

    标签: c++ qt qplaintextedit


    【解决方案1】:

    我对这个问题的解决方案。

    ui->plainTextEdit->insertPlainText("A");//this doesn't have auto scroll
    if(global)//global is bool variable, if it is true, we autoscroll to the bottom
        ui->plainTextEdit->verticalScrollBar()->setValue(ui->plainTextEdit->verticalScrollBar()->maximum());//we auto scroll it everytime
    

    或者

    QTextCursor cursor(ui->plainTextEdit->textCursor());
    cursor.insertText("A");
    if(global)
        ui->plainTextEdit->verticalScrollBar()->setValue(ui->plainTextEdit->verticalScrollBar()->maximum());
    

    现在我们下一步:当用户悬停(输入事件)plainTextEdit 我们停止自动滚动,当用户离开小部件时,我们再次启用自动滚动。我是通过 eventFilter 做的,但我希望你能理解我的想法。

    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
    {
        if(obj==ui->plainTextEdit && (event->type()==QEvent::Enter || event->type()==QEvent::Leave))
        {
    
            if(event->type()==QEvent::Enter)//user move mouse on widget:stop auto-scrolling
                global =false;
            else
                global =true;// leave event:enable auto-scrolling
            ui->label->setText(event->type()==QEvent::Enter ? "Hovering" : "Not Hovering");//just show it to user, you can delete this line
        }
    
    return QObject::eventFilter(obj, event);
    } 
    

    【讨论】:

    • 我理解你的想法,但我不会使用 > ui->plainTextEdit->insertPlainText("A");附加文本。相反,我使用定位光标并插入文本。这是自动滚动到底部。有什么办法可以防止滚动???我试图重新实现 resizeEvent 但没有成功。
    • @user3071624 而不是insertPlainText 我尝试使用QTextCursor cursor(ui->plainTextEdit->textCursor()); cursor.insertText("A"); 的方法(如果我理解正确,你使用这个,我添加我使用的代码来回答)结果是一样。
    • 哦!我现在看到了。但是,当我添加文本时,当文本扩展显示的区域时,滚动仍然会发生。也许我正在使用另一种导致滚动的方法。您的 eventFilter 代码非常好。谢谢。
    【解决方案2】:

    试试这个。我想这就是你想要实现的。

    QScrollBar *bar = plainTextEdit->verticalScrollBar();
    bar->setValue(bar->maximum());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多