当前位置: 首页 > news >正文

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

在这里插入图片描述

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

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

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

MyTextEdit.h

#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部分

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

}



相关文章:

  • 单调队列-滑动窗口算法一篇学会-AcWing 154. 滑动窗口
  • js中的document.querySelect()
  • 哈希表 - 两数之和(Map) - JS
  • OpenBMC:BmcWeb 处理http请求2 查找路由对象
  • 0102-web架构网站搭建-基础入门-网络安全
  • 我的世界1.20.1进阶模组开发教程——升级模板与文字格式
  • Nginx 配置 HTTPS 与 WSS 完整指南
  • 亚马逊新卖家破局指南:从0到1搭建可持续出单模型
  • Linux内核编程
  • 关于CodeJava的学习笔记——11
  • 贪心算法(13)(java)合并区间
  • vscode 使用vue3
  • Linux内核设计——(一)进程管理
  • 2025年汽车加气站操作工备考题库
  • 基于超分辨率与YOLO的多尺度红外小目标检测方法YOLO-MST论文解读
  • OpenCV 图形API(3)高层次设计概览
  • 变量(Variable)
  • 详解VAE损失函数
  • 从零开始学Rust:所有权(Ownership)机制精要
  • Android版本更新服务通知下载实现
  • 富阳做网站洛洛科技/品牌全案营销策划
  • 犀牛云做网站/东方网络律师团队
  • 怎么做网站前端/官网seo是什么意思
  • 广州网站设计开发/百度推广优化排名
  • 组建网站/宁波seo网站服务
  • 在线A视频网站 一级A做爰片/今日新闻十大头条内容