本文主要是介绍【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进
文章目录
- I - 主要原理
- II - 代码实现
- 2.1 - 自定义类
- 2.2 - 实现 Tab 缩进
- 2.3 - 实现反缩进
- III - 参考链接
I - 主要原理
由于 QTextEdit 和 QPlainTextEdit ,都无法实现多行选中缩进与反缩进,选中多行后,按下缩进或反缩进,选中文本都会清空,并替换为(反)缩进或空格。因此会造成使用很不方便和低效的问题。
需要实现一个类继承自 QTextEdit 或 QPlainTextEdit 类并重写其 keyPressEvent 接口,处理 Tab 按键
II - 代码实现
2.1 - 自定义类
自定义类 TextEdit,视使用目的继承 QTextEdit 或 QPlainTextEdit,
#include <QTextEdit>
// 或 #include <QPlainTextEdit>class TextEdit : public QTextEdit
// 或 class TextEdit : public QPlainTextEdit
{Q_OBJECT
public:explicit TextEdit(QWidget* parent = nullptr);protected:void keyPressEvent(QKeyEvent *e) override; // 键盘事件// 添加 override 编译时检查是否重写父类函数,防止敲错
private:// 根据是否保留制表符,设置为 \t 或空格QString m_indentation = "\t"; // 或 " "
}
2.2 - 实现 Tab 缩进
需要包含头文件
#include <QTextCursor> // 获取光标实例
#include <QTextBlock> // 文本块
void TextEdit::keyPressEvent(QKeyEvent* e)
{// 判断 Tab 按键 以及排除 Shift, Ctrl, Alt 等控制按键的情况,因为通常通过 Shift + Tab 实现反缩进if (Qt::Key_Tab && Qt::NoModifier == e->modifiers()){// 获取光标实例QTextCursor cursor = textCursor();// 在无选中的情况下仅插入一个缩进,并返回if (!cursor.hasSelection()){insertPlainText(m_indentation);return;} // 记录光标选中内容的开始和结束位置 spos(start position), epos(end position)int spos = cursor.anchor();int epos = cursor.position();// 在由下向上选中时,交换开始和结束位置if
这篇关于【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!