亲宝软件园·资讯

展开

Qt 输入框@检测

何名取 人气:0

前言

最近在用qt做通讯类的客户端软件,其中有一项功能类似与微信和QQ聊天时的@全体人员和@指定联系人。下面就来探究一下如何实现这项功能。

解决思路

这项功能主要使用QTextEdit来进行输入,当输入@符号时,弹出联系人来进行选择指定的艾特联系人。

方法一:按键事件

首先使用方法一来尝试实现。方法一中需要重写按键事件函数:

#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";
        }
    }
}

第二种方法比较简单,而且没有以上第一张方法的缺陷,大家可以根据需要选择性的进行使用。

加载全部内容

相关教程
猜你喜欢
用户评论