Qt如何实现输入框@联系人的@检测的示例

2022-08-01 12:52:26
目录
前言解决思路方法一:按键事件方法二:光标位置变化信号

前言

最近在用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 输入框@检测内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!