Qt如何實現輸入框@聯系人的@檢測的示例

前言

最近在用qt做通訊類的客戶端軟件,其中有一項功能類似與微信和QQ聊天時的@全體人員和@指定聯系人。下面就來探究一下如何實現這項功能。

解決思路

這項功能主要使用QTextEdit來進行輸入,當輸入@符號時,彈出聯系人來進行選擇指定的艾特聯系人。

  • 當我們輸入@時,會先按下Shift按鍵不松,再按下字母鍵上方的數字鍵的2,也就是@鍵。因此,我們首先考慮使用按鍵事件來檢測是否按下瞭這兩個按鍵,當按下這兩個按鍵時,跳轉至事件處理函數來進行後續處理。
  • 另一種方法是利用QTextEdit的cursorPositionChanged()光標位置變化信號來進行檢測字符輸入,再使用QTextCursor和QTextBlock來檢測輸入字符是否為“@”再進行後續處理。

方法一:按鍵事件

首先使用方法一來嘗試實現。方法一中需要重寫按鍵事件函數:

#ifndef MYEDIT_H
#define MYEDIT_H

#include <QObject>
#include <QTextEdit>
#include <QKeyEvent>

class MyEdit : public QTextEdit
{
    Q_OBJECT
public:
    MyEdit(QWidget *parent);
    
protected:
    //按鍵事件
    void keyPressEvent(QKeyEvent *e);
};

#endif // MYEDIT_H
#include "myedit.h"
#include <QDebug>

MyEdit::MyEdit(QWidget *parent):
    QTextEdit (parent)
{

}

void MyEdit::keyPressEvent(QKeyEvent *e)
{
    if((e->modifiers() == Qt::ShiftModifier) && (e->key() == Qt::Key_At))
    {
        qDebug()<<"@at";
        append(QKeySequence(e->key()).toString());//或者使用append(e->text());                
        return;
    }
    else {
        QTextEdit::keyPressEvent(e);
    }
}

這種方法有兩個缺陷,第一是輸入@後在輸入框中會產生換行,另外一個是在開啟中文輸入法的時候會失效,隻有切換到英文輸入法的情況下才會起作用。

方法二:光標位置變化信號

方法二要用到QTextEdit自帶的信號

void MainWindow::on_textEdit_2_cursorPositionChanged()
{
    QTextCursor tc = ui->textEdit_2->textCursor();
    QTextBlock tb = tc.block();
    if(!tb.text().isEmpty())
    {
        QString tx = tb.text();
        if(tx.endsWith("@"))
        {
            qDebug()<<"@at";
        }
    }
}

第二種方法比較簡單,而且沒有以上第一張方法的缺陷,大傢可以根據需要選擇性的進行使用。

到此這篇關於Qt如何實現輸入框@聯系人的@檢測的示例的文章就介紹到這瞭,更多相關Qt 輸入框@檢測內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: