
对工作台文本框进行控制。含以下内容。详细说明在源码中可查看
- 至最底部
- 停止滚动
- 开始滚动
源码分两部分. .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;
}
});
}