QT TextEdit事件过滤器
QTextEdit控件不能用像lineEdit控件可以正则表达式去过滤输入内容,使用事件过滤器可以达到一样的效果;这里过滤非hex字符,对于非hex字符拦截不输入,对于hex字符不拦截,按照原本事件处理,从而达到只允许输入hex字符。
对事件过滤器函数
return ture; 则拦截,不再往下传播;
return false; 则不拦截,往下继续传播;
如果想对特定的按键做另外处理,不按照原事件处理,则在事件过滤器函数里处理,然后return ture;不再继续往下传播即可。
英文输入法下,事件是按键事件,通过获取键值去判断哪个按键输入;
中文输入法下,事件是输入事件,获取的是字符串,对字符串的值进行判断即可,字符串的值此时可正则表达式过滤
MainWindow.h
class MainWindow: public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool eventFilter(QObject *obj, QEvent *e); //事件过滤器函数
private slots:
private:
Ui::MainWindow *ui;
};
MainWindow.cpp
//析构函数内
//对发送框内容,安装事件过滤器,只有发送窗口的输入数据会被过滤
ui->sendEdit->installEventFilter(this);
//事件过滤器函数,对发送框内容进行过滤
bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
if(obj == ui->sendEdit) //判断过滤事件是否是发送窗口事件
{
if(ui->asciiradioButton->isChecked()==true) //字符串格式,不过滤
return false; //不拦截,继续传播
else if(ui->hexradioButton->isChecked()==true)//hex格式
{
//英文输入法下的键盘事件
if(e->type() == QEvent::KeyPress) //过滤键盘事件
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e); //强行转换为按键事件
int keyValue = keyEvent->key(); //获取按键值
if(keyValue>=KEY_0 && keyValue<=KEY_9) //0~9
return false; //不拦截,继续传播
else if(keyValue>=KEY_a && keyValue<=KEY_f) //a~f,A~F
return false; //不拦截,继续传播
else if(keyValue==KEY_SPACE || keyValue==KEY_COMMA || keyValue==Key_Backspace)
return false; //不拦截,继续传播,空格,逗号,退格按键
else //对其他情况拦截
return true; //拦截,不再传播
}
//中文输入法状态下的键盘事件
else if(e->type() == QEvent::InputMethod)
{
QInputMethodEvent *keyEvent = dynamic_cast<QInputMethodEvent *>(e); //强制转换为输入法事件
QString strInput = keyEvent->commitString(); //此时的strInput就是键盘上按键
if(strInput.isEmpty()) //非按键事件不拦截,不加这个操作,窗口不会实时显示输入的按键字母
return false; //不拦截,继续传播
strInput.remove(QRegExp("[^a-fA-F0-9]")); //对输入的内容筛选,hex格式的留下
keyEvent->setCommitString(strInput); //更改指针的字符串内容
return false; //不拦截,继续传播(输入的数据已经被更改了)
}
return false; //不拦截,不再传播
}
else
return false; //不拦截,继续传播
}
else
return CLP::eventFilter(obj, e);//当不确定是否继续传播时,按照父类的方法来处理.即调用父类的evenFilter函数
}