Qt之QTextEdit控制文本滚动, 停止滚动, 开始滚动, 鼠标控制滚动

对工作台文本框进行控制。含以下内容。详细说明在源码中可查看

  • 至最底部
  • 停止滚动
  • 开始滚动

源码分两部分. .h文件和.cpp文件
MyTextEdit.h

c++ 复制代码
#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H

#include <QObject>
#include <QTextEdit>
#include <QScrollBar>
#include <QDebug>
#include <QTimer>
#include <QWheelEvent>

/**
 * @brief 文本显示框
 * @author linbin
 */
class MyTextEdit: public QTextEdit
{
    Q_OBJECT
public:
    explicit MyTextEdit(QWidget *parent = nullptr);

    // 重写 append 方法
    void append(const QString &text) {
        // 获取垂直滚动条
        QScrollBar *scrollbar = this->verticalScrollBar();
        // 判断是否接近底部可以自滚动. 当前滚动条位置是否在底部50距离以内
        bool scrollbarAtBottom  = isScrollAtBottom() && scrollbarAtBottomFlag;
        // 当前滚动条位置
        int scrollbarPrevValue = scrollbar->value();
        // 将光标移动到文本末尾
        QTextCursor cursor = this->textCursor();
        cursor.movePosition(QTextCursor::End);
        this->setTextCursor(cursor);
        // 添加文本
        QTextEdit::append(text);
        QTimer::singleShot(0, this, [=]{

            // 停止滚动
            if (!startAutoScrollFlag) {
                // 此时光标不可见, 设置滚动条位置
                this->verticalScrollBar()->setValue(scrollbarPrevValue);
                return;
            }
            // 若在底部, 让光标可见及滚动
            if (scrollbarAtBottom) {
                this->ensureCursorVisible();
            } else {
                // 此时光标不可见, 设置滚动条位置
                this->verticalScrollBar()->setValue(scrollbarPrevValue);
            }
        });

    }
    /**
     * @brief 是否已到底部
     * @return
     */
    bool isScrollAtBottom() {
        return (this->verticalScrollBar()->value() >= (this->verticalScrollBar()->maximum() - 50));
    }
    /**
     * @brief 至最底部, 文本向下自动滚动. 若设置了停止滚动, 则即使到了最底部也不会滚动
     */
    void toEnd() {
        QTextCursor cursor = this->textCursor();
        cursor.movePosition(QTextCursor::End);
        this->setTextCursor(cursor);
        qDebug() << "this.startAutoScrollFlag:" << this->startAutoScrollFlag;
        // 在底部, 让光标可见及滚动
        if (this->startAutoScrollFlag) {
            this->ensureCursorVisible();
        }
        this->scrollbarAtBottomFlag = true;
    }
    /**
     * @brief 停止滚动, 则即使到了最底部也不会滚动, 无需操作操作滚动条即可停止滚动
     */
    void toStopScroll() {
        this->startAutoScrollFlag = false;
    }
    /**
     * @brief 开始滚动, 正常运转, 到了底部会自动滚动, 向上查看会停止滚动
     */
    void toStartScroll() {
        this->startAutoScrollFlag = true;
    }
private:
    /** 是否开始滚动 */
    bool startAutoScrollFlag = true;
    /** 是否已到底部 */
    bool scrollbarAtBottomFlag = true;

};

#endif // MYTEXTEDIT_H

.cpp部分

c++ 复制代码
#include "mytextedit.h"

MyTextEdit::MyTextEdit(QWidget *parent): QTextEdit(parent)
{
    // 设置行数最多150
    this->document()->setMaximumBlockCount(150);
    // 设置名称
    this->setObjectName(QString::fromUtf8("console"));
    // 监听滚动事件
    connect(this->verticalScrollBar(),  &QScrollBar::valueChanged, this, [=](int value) {
        if (!this->startAutoScrollFlag) {
            this->scrollbarAtBottomFlag = false;
        } else {
            this->startAutoScrollFlag = true;
        }
    });

}
相关推荐
水w5 分钟前
【Android Studio】如何卸载干净(详细步骤)
android·开发语言·android studio·activity
weixin_307779135 分钟前
判断HiveQL语句为建表语句的识别函数
开发语言·数据仓库·hive·c#
一顿操作猛如虎,啥也不是!11 分钟前
JAVA-Spring Boot多线程
开发语言·python
v维焓20 分钟前
C++(思维导图更新)
开发语言·c++·算法
jiet_h20 分钟前
深入解析KSP(Kotlin Symbol Processing):现代Android开发的新利器
android·开发语言·kotlin
_未知_开摆22 分钟前
uniapp APP端在线升级(简版)
开发语言·前端·javascript·vue.js·uni-app
花月C27 分钟前
Spring IOC:容器管理与依赖注入秘籍
java·开发语言·rpc
ylfhpy34 分钟前
Java面试黄金宝典22
java·开发语言·算法·面试·职场和发展
CYRUS_STUDIO1 小时前
Frida Hook Native:jobjectArray 参数解析
android·c++·逆向
榆榆欸1 小时前
4.Socket类、InetAddr类、Epoll类实现模块化
linux·c++·tcp/ip