2.Qt Quick快速入门之qml与C++交互

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9139
QQ
跳转到指定楼层
楼主
发表于 2017-7-29 22:49:03 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

C++中使用qml对象,直接使用findChild获取qml对象,然后调用setProperty方法设置属性,当然必须在加载qml之后才能使用,不然findChild找不到对象,用法如下。

  1. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  2.     QObject * text_Msg = engine.rootObjects()[0]->findChild<QObject*>("text_Msg");
  3.     text_Msg->setProperty("color","red");
复制代码

qml使用C++对象,这也是Qt中Model/View的实现方法,下面是一个例子。

  首先,类需要继承自QObejct

  1. class User:public QObject
  2. {
  3.     Q_OBJECT
  4.     Q_PROPERTY(QString Name READ Name WRITE setName NOTIFY NameChanged)
  5.     Q_PROPERTY(int Age READ Age WRITE setAge NOTIFY AgeChanged)
  6.     Q_PROPERTY(QString Message READ Message WRITE setMessage NOTIFY MessageChanged)
  7. public:
  8.     User();
  9.     User(string name,int age);

  10.     QString Name();
  11.     void setName(QString name);

  12.     int Age();
  13.     void setAge(int age);

  14.     QString Message();
  15.     void setMessage(QString message);
  16. signals:
  17.     void NameChanged();
  18.     void AgeChanged();
  19.     void MessageChanged();
  20. public slots:
  21. void editOk();   

  22. private :
  23.     QString m_name;
  24.     int m_age;
  25.     QString m_message;
  26. };
复制代码
  1. User::User()
  2. {
  3.   this->setName("");
  4.   this->setAge(0);
  5. }
  6. User::User(string name, int age)
  7. {
  8.   QString q_name = QString::fromStdString(name);
  9.   this->setName(q_name);
  10.   this->setAge(age);
  11. }

  12. QString User::Name()
  13. {
  14.   return m_name;
  15. }
  16. void User::setName(QString name)
  17. {
  18.   m_name = name;
  19.   emit NameChanged();
  20.   setMessage(QString("名称改变为:%1").arg(name));
  21. }

  22. int User::Age()
  23. {
  24.   return m_age;
  25. }
  26. void User::setAge(int age)
  27. {
  28.   m_age = age;
  29.   emit AgeChanged();
  30.   setMessage(QString("年龄改变为:%1").arg(age));
  31. }

  32. QString User::Message()
  33. {
  34.     return m_message;
  35. }

  36. void User::setMessage(QString message)
  37. {
  38.     m_message = message;
  39.     emit MessageChanged();
  40. }
  41. void User::editOk()
  42. {
  43.     setMessage("您点击了确定按钮");
  44. }
复制代码

然后,需要向qml中注册这个类,这样我们在qml中就可以导入这个类了

  1. qmlRegisterType<User>("Models.User",1,0,"UserModel");
复制代码
  1. import Models.User 1.0
复制代码

通常,直接将对象设置到qml对象的上下文,然后在qml中使用C++对象的属性

  1. QQmlApplicationEngine engine;
  2.     QQmlContext* context = engine.rootContext();
  3.     User* userModel = new User("测试",20);
  4.     context->setContextProperty("testUserModel",userModel);
复制代码
  1. GridLayout{
  2.         anchors.centerIn: parent
  3.         width:300
  4.         columnSpacing: 10
  5.         rowSpacing: 10
  6.         rows:4
  7.         columns:2

  8.         Item{
  9.             Layout.row: 0
  10.             Layout.column: 0
  11.             width:100
  12.             height:30
  13.             Text{
  14.                 text:"Name:"
  15.                 anchors.centerIn: parent
  16.             }
  17.         }
  18.         Item{
  19.             Layout.row: 0
  20.             Layout.column: 1
  21.             Layout.fillWidth: true
  22.             height:30
  23.             TextField{
  24.                 anchors.verticalCenter: parent.verticalCenter
  25.                 width:parent.width
  26.                 height:24
  27.                 id:textfield_Name
  28.                 text: testUserModel.Name
  29.                 onEditingFinished: {
  30.                     testUserModel.Name = textfield_Name.text;
  31.                 }
  32.             }
  33.         }

  34.         Item{
  35.             Layout.row: 1
  36.             Layout.column: 0
  37.             width:100
  38.             height:30
  39.             Text{
  40.                 text:"Age:"
  41.                 anchors.centerIn: parent
  42.             }
  43.         }
  44.         Item{
  45.             Layout.row: 1
  46.             Layout.column: 1
  47.             Layout.fillWidth: true
  48.             height:30
  49.             TextField{
  50.                 anchors.verticalCenter: parent.verticalCenter
  51.                 width:parent.width
  52.                 height:24
  53.                 id:textfield_Age
  54.                 text:testUserModel.Age
  55.                 onEditingFinished: {
  56.                     testUserModel.Age = textfield_Age.text;
  57.                 }
  58.             }
  59.         }

  60.         Item{
  61.             Layout.row: 2
  62.             Layout.column: 0
  63.             Layout.fillWidth: true
  64.             height: 50
  65.             Layout.columnSpan: 2
  66.             RowLayout{
  67.                 anchors.centerIn: parent
  68.                 Button{
  69.                     id:button_OK
  70.                     text:"确定"
  71.                     action: button_OK_Action
  72.                     onClicked:{
  73.                         testUserModel.editOk();
  74.                     }
  75.                 }
  76.                 Button{
  77.                     id:button_Cancel
  78.                     text:"取消"
  79.                     onClicked: {
  80.                         Qt.quit();
  81.                     }
  82.                 }
  83.             }
  84.         }

  85.         Item{
  86.             Layout.row: 3
  87.             Layout.column: 0
  88.             Layout.fillWidth: true
  89.             height: 30
  90.             Layout.columnSpan: 2
  91.             Text {
  92.                 id: text_Msg
  93.                 objectName: "text_Msg"
  94.                 text: testUserModel.Message
  95.                 anchors.fill: parent
  96.                 verticalAlignment: Qt.AlignVCenter
  97.             }
  98.         }

  99.     }
复制代码


在qml中绑定C++对象的属性时,其实是执行C++对象属性的READ方法;而设置属性时,则是执行WRITE方法;C++属性的NOTIFY方法用于属性变更通知,当我们调用该方法时(通常在前面加上emit表示这是个信号方法),qml中的属性绑定就会再次执行READ方法。

  下面是效果,编辑框失去焦点时,就会设置属性,进而调用C++对象的WRITE方法,然后在WRITE方法中更新其他属性。


分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表