起因
设备需求点击之后触发蜂鸣器,有两套方案:
- 每个按钮都写入这串指令,令其能够调用触发蜂鸣器的类
- 通过全局的方式,这种只需要一个地方写调用程序即可,更加可行一点
QWidget 触摸事件捕捉
QWidget 是比较简单能够捕捉触摸事件的,就是对 QApplication 中的 notify 进行覆盖
bool MyApplication::notify(QObject *obj, QEvent *event)
{
//常规鼠标点击或按键
if((obj!=NULL) &&
(event->type()==QEvent::KeyPress || event->type()==QEvent::MouseButtonPress ||
event->type()==QEvent::MouseButtonDblClick) )
{
bool isEnable=false;
//普通 widget 按键事件
if(obj->inherits("QPushButton")){
QPushButton *pPushButton=(QPushButton*)obj;
isEnable=pPushButton->isEnabled();
}else if(obj->inherits("QToolButton")){
QToolButton *pToolButton=(QToolButton*)obj;
isEnable=pToolButton->isEnabled();
}
if(isEnable) {
g_soundSet->keyVoice();
}
}
return QApplication::notify(obj,event);
}
QML 触摸事件 (含触摸屏输入)
方式一: QML 自带
TapHandler {
acceptedButtons: Qt.RightButton
onTapped: console.log("right clicked")
}
这样就能够捕捉同文件内对象的各种事件,局限性就是没法全局实现捕获
方式二: 全局捕获(注意这里对于 ListView 这类触摸事件暂时没法特别区分出来)
bool MyApplication::notify(QObject *obj, QEvent *event)
{
// 触摸板而言 电容屏的输出是 TouchEnd 来具体可打印一下输出
if ((obj != NULL && event->type() == QEvent::TouchEnd)) {
//普通按钮
if (obj->inherits("QQuickButton")) {
qDebug() << "------------T";
}
}
//常规鼠标点击或按键
if((obj!=NULL) &&
(event->type()==QEvent::KeyPress || event->type()==QEvent::MouseButtonPress ||
event->type()==QEvent::MouseButtonDblClick) )
{
//常规鼠标点击(右击)
if (obj->inherits("QQuickAbstractButton")) {
qDebug() << "------------T";
}
//键盘事件
if (obj->inherits("QQuickMouseArea")) {
if (obj->parent()) {
if (obj->parent()->objectName() == "keyboard")
qDebug() << "-------VVVVVVV";
}
}
}
return QApplication::notify(obj,event);
}