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

}
相关推荐
WWTYYDS_66612 分钟前
JsonCpp超详细使用教程
c++
Joey_friends29 分钟前
指纹authenticate流程图
android·java·c++
小小晓.34 分钟前
C++小白记:C风格字符串和数组用法
c语言·开发语言·c++
Helen_cai42 分钟前
OpenHarmony 项目统一全局样式、尺寸、色彩主题封装 ThemeUtil(API23)
开发语言·前端·javascript·华为·harmonyos
郑州光合科技余经理43 分钟前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
cpp_25011 小时前
P1540 [NOIP 2010 提高组] 机器翻译
数据结构·c++·算法·队列·noip·洛谷题解
深念Y1 小时前
开发者如何清理和迁移C盘堆积的垃圾
c语言·开发语言
2501_909509101 小时前
DAY 28
开发语言·python
user-猴子1 小时前
从零构建 2048 游戏,解析“Python-Use”范式的完整闭环
开发语言·python·游戏
咕白m6252 小时前
通过 C++ 写入数据到 Excel 文档
c++·后端