Qt 输入框@检测
何名取 人气:0前言
最近在用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"; } } }
第二种方法比较简单,而且没有以上第一张方法的缺陷,大家可以根据需要选择性的进行使用。
加载全部内容