【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