想要查看内容赶紧注册登陆吧!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
C++中使用qml对象,直接使用findChild获取qml对象,然后调用setProperty方法设置属性,当然必须在加载qml之后才能使用,不然findChild找不到对象,用法如下。 - engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
- QObject * text_Msg = engine.rootObjects()[0]->findChild<QObject*>("text_Msg");
- text_Msg->setProperty("color","red");
复制代码qml使用C++对象,这也是Qt中Model/View的实现方法,下面是一个例子。 首先,类需要继承自QObejct - class User:public QObject
- {
- Q_OBJECT
- Q_PROPERTY(QString Name READ Name WRITE setName NOTIFY NameChanged)
- Q_PROPERTY(int Age READ Age WRITE setAge NOTIFY AgeChanged)
- Q_PROPERTY(QString Message READ Message WRITE setMessage NOTIFY MessageChanged)
- public:
- User();
- User(string name,int age);
- QString Name();
- void setName(QString name);
- int Age();
- void setAge(int age);
- QString Message();
- void setMessage(QString message);
- signals:
- void NameChanged();
- void AgeChanged();
- void MessageChanged();
- public slots:
- void editOk();
- private :
- QString m_name;
- int m_age;
- QString m_message;
- };
复制代码- User::User()
- {
- this->setName("");
- this->setAge(0);
- }
- User::User(string name, int age)
- {
- QString q_name = QString::fromStdString(name);
- this->setName(q_name);
- this->setAge(age);
- }
- QString User::Name()
- {
- return m_name;
- }
- void User::setName(QString name)
- {
- m_name = name;
- emit NameChanged();
- setMessage(QString("名称改变为:%1").arg(name));
- }
- int User::Age()
- {
- return m_age;
- }
- void User::setAge(int age)
- {
- m_age = age;
- emit AgeChanged();
- setMessage(QString("年龄改变为:%1").arg(age));
- }
- QString User::Message()
- {
- return m_message;
- }
- void User::setMessage(QString message)
- {
- m_message = message;
- emit MessageChanged();
- }
- void User::editOk()
- {
- setMessage("您点击了确定按钮");
- }
复制代码
然后,需要向qml中注册这个类,这样我们在qml中就可以导入这个类了 - qmlRegisterType<User>("Models.User",1,0,"UserModel");
复制代码
通常,直接将对象设置到qml对象的上下文,然后在qml中使用C++对象的属性 - QQmlApplicationEngine engine;
- QQmlContext* context = engine.rootContext();
- User* userModel = new User("测试",20);
- context->setContextProperty("testUserModel",userModel);
复制代码
在qml中绑定C++对象的属性时,其实是执行C++对象属性的READ方法;而设置属性时,则是执行WRITE方法;C++属性的NOTIFY方法用于属性变更通知,当我们调用该方法时(通常在前面加上emit表示这是个信号方法),qml中的属性绑定就会再次执行READ方法。 下面是效果,编辑框失去焦点时,就会设置属性,进而调用C++对象的WRITE方法,然后在WRITE方法中更新其他属性。
|