起因
設備需求點擊之後觸發蜂鳴器,有兩套方案:
- 每個按鈕都寫入這串指令,令其能夠調用觸發蜂鳴器的類
- 通過全局的方式,這種只需要一個地方寫調用程序即可,更加可行一點
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);
}