qml 鍵盤事件傳遞的順序
-
思考:鍵盤事件傳遞的順序是什麼樣子的 ?
編寫以下代碼作爲測試:
import QtQuick 2.7 import QtQuick.Window 2.2 Rectangle{ width: 800; height: 800; Rectangle{ id: rect_a; anchors.top: parent.top; anchors.left: parent.left; width: 400; height: 400; color: focus ? "#111111" : "#db1f5b"; focus: true; Keys.onPressed: { if(event.key === Qt.Key_A){ console.log("A pressed"); event.accepted = true; } } KeyNavigation.tab: rect_b; } Rectangle{ id: rect_b; anchors.top: parent.top; anchors.right: parent.right; width: 400; height: 400; color: focus ? "#111111" : "#db1f5b"; Keys.onPressed: { if(event.key === Qt.Key_B){ console.log("B pressed"); event.accepted = true; } } KeyNavigation.tab: rect_c; } Rectangle{ id: rect_c; anchors.bottom: parent.bottom; anchors.right: parent.right; width: 400; height: 400; color: focus ? "#111111" : "#db1f5b"; Keys.onPressed: { if(event.key === Qt.Key_C){ console.log("C pressed"); event.accepted = true; } } KeyNavigation.tab: rect_d; } Rectangle{ id: rect_d; anchors.bottom: parent.bottom; anchors.left: parent.left; width: 400; height: 400; color: focus ? "#111111" : "#db1f5b"; Keys.onPressed: { if(event.key === Qt.Key_D){ console.log("D pressed"); event.accepted = true; } } KeyNavigation.tab: rect_a; } Keys.onPressed: { console.log("root:" + event.key); event.accepted = true; } }
得出結論:qml 中鍵盤事件傳遞是由具有焦點的那個組件,一層層向上傳遞,直到被處理或者到達根對象被而忽略。在官方文檔中也有提到
延伸:widget中事件傳遞順序又是怎樣的?
由豆子
的這篇文章裏面可以知道, widget中事件的傳播是在組件層次上面的,而不是依靠類繼承機制。 參考代碼如下:
class CustomButton : public QPushButton
{
Q_OBJECT
public:
CustomButton(QWidget *parent) : QPushButton(parent)
{
}
protected:
void mousePressEvent(QMouseEvent *event)
{
qDebug() << "CustomButton";
}
};
class CustomButtonEx : public CustomButton
{
Q_OBJECT
public:
CustomButtonEx(QWidget *parent) : CustomButton(parent)
{
}
protected:
void mousePressEvent(QMouseEvent *event)
{
qDebug() << "CustomButtonEx";
}
};
class CustomWidget : public QWidget
{
Q_OBJECT
public:
CustomWidget(QWidget *parent) : QWidget(parent)
{
}
protected:
void mousePressEvent(QMouseEvent *event)
{
qDebug() << "CustomWidget";
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0) : QMainWindow(parent)
{
CustomWidget *widget = new CustomWidget(this);
CustomButton *cbex = new CustomButton(widget);
cbex->setText(tr("CustomButton"));
CustomButtonEx *cb = new CustomButtonEx(widget);
cb->setText(tr("CustomButtonEx"));
QVBoxLayout *widgetLayout = new QVBoxLayout(widget);
widgetLayout->addWidget(cbex);
widgetLayout->addWidget(cb);
this->setCentralWidget(widget);
}
protected:
void mousePressEvent(QMouseEvent *event)
{
qDebug() << "MainWindow";
}
};
思考:qml 中Window 應該如何處理鍵盤事件?
因爲Keys是專門給Item來處理鍵盤事件的,Window 無法使用Item來處理鍵盤事件,所以Window應該怎樣處理鍵盤事件 ?