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

}
相关推荐
zl21878654481 小时前
Playwright同步、异步、并行、串行执行效率比较
开发语言·python·测试工具
努力学习的小廉1 小时前
我爱学算法之—— 模拟(下)
c++·算法
Larry_Yanan1 小时前
QML学习笔记(十七)QML的属性变更信号
javascript·c++·笔记·qt·学习·ui
Tony Bai1 小时前
【Go开发者的数据库设计之道】05 落地篇:Go 语言四种数据访问方案深度对比
开发语言·数据库·后端·golang
gopyer1 小时前
180课时吃透Go语言游戏后端开发3:Go语言中其他常用的数据类型
开发语言·游戏·golang·游戏后端开发
come112341 小时前
Go vs. PHP:核心优势劣势对比
开发语言·golang·php
eqwaak02 小时前
Flask实战指南:从基础到高阶的完整开发流程
开发语言·后端·python·学习·flask
hsjkdhs2 小时前
C++之拷贝构造(浅拷贝与深拷贝)、this指针、内联函数
c++
默|笙2 小时前
【c++】红黑树的部分实现
开发语言·c++
轩情吖3 小时前
Qt常用控件之QSpinBox
开发语言·c++·qt·控件·桌面级开发·qspinbox·微调框