【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进

发布于:2024-03-04 ⋅ 阅读:(119) ⋅ 点赞:(0)

【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

网站公告

今日签到

点亮在社区的每一天
去签到