QT signals 保存到 QMap

12 篇文章 0 订阅

一般适用较多且统一的不同信号,粗略代码(不能直接运行)如下:

class Person{
public:
	Person(){
		m_signalMap = { // 3.初始化时添加到map
			{"eat", &buttonForPerson::eat},
			{"drink", &buttonForPerson::drink},
			...
		};
	}

slots:
	void actions(){
		any *act = (any)(sender());
		if (act)
			emit (this->*m_signalMap[act->actionName])(); 
			/* 4.调用,发出信号,可以先判断值是否为空;
			     我这里不判断,为空代表有某些存在的动作没有被赋值或动作本身就不应该存在,表明代码有问题 */
	}
	
signals:
	void eat();
	void drink();
	...
	
private:
	using p_signal_type = void(Person::*)();  // 1.声明函数指针类型
	QMap<QString, p_signal_type> m_signalMap; // 2.声明Map;直接void(Person::*)(),可读性差
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过使用Qt的属性系统将QMap传递到QML中,并在QML中使用它。以下是一个示例: 首先,在C++代码中,将QMap作为QObject的属性注册: ```cpp #include <QObject> #include <QQmlEngine> #include <QQmlContext> #include <QMap> class Backend : public QObject { Q_OBJECT Q_PROPERTY(QMap<QString, QVariant> map READ map WRITE setMap NOTIFY mapChanged) public: explicit Backend(QObject *parent = nullptr) : QObject(parent) {} QMap<QString, QVariant> map() const { return m_map; } void setMap(const QMap<QString, QVariant> &map) { if (m_map != map) { m_map = map; emit mapChanged(); } } signals: void mapChanged(); private: QMap<QString, QVariant> m_map; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); QQmlEngine engine; Backend backend; engine.rootContext()->setContextProperty("backend", &backend); // 将QMap添加到属性 QMap<QString, QVariant> myMap; myMap.insert("key1", "value1"); myMap.insert("key2", 42); backend.setMap(myMap); // 加载QML界面 QQmlComponent component(&engine, QUrl("main.qml")); component.create(); return app.exec(); } ``` 然后,在QML代码中,可以通过后端对象的属性访问QMap: ```qml import QtQuick 2.0 Item { width: 200 height: 200 Text { text: "Value for key1: " + backend.map["key1"] } Text { text: "Value for key2: " + backend.map["key2"] } } ``` 在这个例子中,我们在C++代码中创建一个Backend对象,并将其作为上下文属性添加到QQmlContext中。然后,我们将QMap添加到Backend对象的属性中。接下来,我们使用QQmlComponent加载QML界面,并在界面中访问Backend对象的属性。 请确保在.pro文件中添加适当的模块依赖,例如:`QT += qml` 和 `QT += quick`。 希望这可以帮助您将QMap传递到QML并在QML中使用它!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值