qml鍵盤事件傳遞順序

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應該怎樣處理鍵盤事件 ?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章