c++ - 在 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 用于不同的模型。
提前致谢
解决方案
在您的特定示例中,将其分解为一个通用函数:
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
它来根据您的模型值覆盖对象的信号处理程序。
推荐阅读
- javascript - 通过一个 ref React 访问多个元素
- android - 无法使用 XML 向 Button 添加边框
- javascript - 如何在three.js中使用二维一、二形图合并绘制?
- google-cloud-platform - 无法将磁盘映像导入 Google Cloud Platform
- typescript - TypeScript Watch 选项不起作用 Windows 10 命令行
- jasper-reports - 同一组页脚中另一个拉伸字段下方的拉伸字段
- angular - 我应该在角度组件中为名称属性添加前缀吗?
- python - find_element_by_class_name 类空间不起作用
- arrays - 在字典中的数组中加载带有字典的 JSON 文件
- npm - npm 未被识别为内部或外部命令