首页 > 解决方案 > 在 Qt 中重构 if-else

问题描述

我有几个可以按下的键,每次按键都会发出一个与之对应的信号。但是,按键会根据正在操作的对象执行不同的操作。我在下面有一个示例图。

// keyboard.cpp
void receive_key_press(uint8_t key_id){

    if(key_id == 1)
        emit key_one_pressed();
    else if(key_id == 2)
        emit key_two_pressed();
    else if(key_id == 3)
        emit key_three_pressed();
}
Class A : public QObject {
    // use Q_PROPERTY here to expose the member var 'model' to qml

    public:           
        int model; 
}

int main(){
    
    Keyboard keyboard;
    A obj;
    if (some_condition)
        obj.model = 5;
    else
        obj.model = 7;

    // Engine initialization here and exposing 'obj' and 'keyboard' to qml using setContextProperty
}

然后在 main.qml

Connections {
    target: keyboard

    onKey_one_pressed: {
        if (obj.model == 5)
            // do something
        else
            // do something else

        // execute some common code here
    }

    onKey_two_pressed: {
        if (obj.model == 5)
            // do something
        else
            // do something else
    }

    onKey_three_pressed: {
        if (obj.model == 5)
            // do something
        else
            // do something else
    }
}

如何简化和避免 main.qml 中的所有 if-else 条件。Qt 中是否有一些东西可以使这更容易,并提供一些处理“Gui 状态”的全局方法。我知道 Qt 中有一个文件选择器,但这并不是我真正想要的。我想有一个更好的方法,而不是在 Gui 中到处都有 if-else 用于不同的模型。

提前致谢

标签: c++qtqml

解决方案


在您的特定示例中,将其分解为一个通用函数:

Connections {
    target: keyboard

    function commonCode() {
        // execute some common code here
    }

    onKey_one_pressed: {
        if (obj.model == 5)
            // do something
        else
            // do something else

        commonCode();
    }

    onKey_two_pressed: {
        if (obj.model == 5)
            // do something
        else
            // do something else

        commonCode();
    }

    onKey_three_pressed: {
        if (obj.model == 5)
            // do something
        else
            // do something else

        commonCode();
    }
}

您还可以放置commonCode在更广泛可访问的地方,以进一步减少代码重复。

但是,也有 QML 状态:https ://doc.qt.io/qt-5/qtquick-statesanimations-states.html

这是管理 GUI 的不同配置的一种非常方便的方法。您可以使用PropertyChanges它来根据您的模型值覆盖对象的信号处理程序。


推荐阅读