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

}
相关推荐
tankeven5 分钟前
动态规划专题(03):区间动态规划从原理到实践(未完待续)
c++·算法·动态规划
天若有情67310 分钟前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
好家伙VCC14 分钟前
**发散创新:基于Python与ROS的机器人运动控制实战解析**在现代机器人系统开发中,**运动控制**是实现智能行为的核心
java·开发语言·python·机器人
2401_8274999914 分钟前
python项目实战09-AI智能伴侣(ai_partner_2-3)
开发语言·python
派葛穆16 分钟前
汇川PLC-Python与汇川easy521plc进行Modbustcp通讯
开发语言·python
freshman_y1 小时前
Qtcreator怎么新建安卓项目?编写一个五子棋游戏APP?
android·qt
大前端下的小角色1 小时前
UE5.6 Cesium 插件编译踩坑记录(UE 5.6 + MSVC 14.38 + CMake 3.31)
c++
lzhdim1 小时前
SharpCompress:跨平台的 C# 压缩与解压库
开发语言·c#
嘿嘿嘿x31 小时前
Linux记录过程
linux·开发语言
默 语1 小时前
Records、Sealed Classes这些新特性:Java真的变简单了吗?
java·开发语言·python