问题5.3 QPlainTextEdit实现滚动锁定

Qt 5.3 QPlainTextEdit implement scroll lock

本文关键字:滚动 锁定 实现 QPlainTextEdit 问题      更新时间:2023-10-16

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

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

有什么想法吗?

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

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);
} 

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

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