想要查看内容赶紧注册登陆吧!
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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方法中更新其他属性。  
  
 |