首页 > 编程语言 >C++ 与 QML交互

C++ 与 QML交互

时间:2023-08-12 23:01:14浏览次数:39  
标签:name int age C++ Person QML 交互 void QString

前言

在 QT 中 既然 qml处理前端,C++处理后端,那么 C++ 和 QML 是如何进行交互?

将对象暴露给 qml

void QQmlContext::setContextProperty(const QString &name, QObject *value)
Set the value of the name property on this context.
QQmlContext does not take ownership of value.

这样在 qml 中可以通过 name对象直接使用对象的属性或者方法。

  1. 对象的方法 要求必须是 公共的槽函数,或者是被 Q_INVOKABLE 修饰的普通公有函数。代码如下
//MyClass.cpp
#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = nullptr);
    Q_INVOKABLE int sum(int a, int b);

signals:

public slots:
    void print();
};

#endif // MYCLASS_H
//main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "MyClass.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    MyClass *myClass = new MyClass;

    QQmlApplicationEngine engine;
    QQmlContext *context = engine.rootContext();
    context->setContextProperty("myClass", myClass);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Component.onCompleted: {
        myClass.print();
        console.log(myClass.sum(1, 2));
    }
}

将C++中类的属性暴露给qml。使用 Q_PROPERTY(...)进行暴露

  class Message : public QObject
  {
      Q_OBJECT
      Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
  public:
      void setAuthor(const QString &a) {
          if (a != m_author) {
              m_author = a;
              emit authorChanged();
          }
      }
      QString author() const {
          return m_author;
      }
  signals:
      void authorChanged();
  private:
      QString m_author;
  };
  int main(int argc, char *argv[]) {
      QGuiApplication app(argc, argv);

      QQuickView view;
      Message msg;
      view.engine()->rootContext()->setContextProperty("msg", &msg);
      view.setSource(QUrl::fromLocalFile("MyItem.qml"));
      view.show();

      return app.exec();
  }
  // MyItem.qml
  import QtQuick 2.0

  Text {
      width: 100; height: 100
      text: msg.author    // invokes Message::author() to get this value

      Component.onCompleted: {
          msg.author = "Jonah"  // invokes Message::setAuthor()
      }
  }

注意 这句话 QQmlContext does not take ownership of value. 也就是说 在使用 setContextProperty 应该注意暴露对象的生命周期。

在QML中注册C++对象

qmlRegisterType<Person>("LiBai.Person", 1, 0, "Person");
//person.cpp
#include "Person.h"
#include <QDebug>

Person::Person(QObject *parent) : QObject(parent), m_name(QStringLiteral("小明")), m_age(18)
{

}

void Person::print()
{
    qDebug() << "name : " << m_name << " age : " << m_age;
}

//Person.h
#ifndef PERSON_H
#define PERSON_H

#include <QObject>
#include <QString>

class Person : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChaged)
public:
    explicit Person(QObject *parent = nullptr);
    Q_INVOKABLE void print();

    QString name() const
    {
        return m_name;
    }

    int age() const
    {
        return m_age;
    }

signals:

    void nameChanged(QString name);

    void ageChaged(int age);

public slots:
void setName(QString name)
{
    if (m_name == name)
        return;

    m_name = name;
    emit nameChanged(m_name);
}

void setAge(int age)
{
    if (m_age == age)
        return;

    m_age = age;
    emit ageChaged(m_age);
}

private:
    QString m_name;
    int m_age;
};

#endif // PERSON_H
main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Layouts 1.3
import LiBai.Person 1.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Item{
        id: rootItem
        anchors.fill: parent
        ColumnLayout{
            id: columnLayout
            anchors.fill: parent
            Rectangle{
                id: rect
                Layout.preferredHeight: 240
                Layout.preferredWidth: columnLayout.width
                Layout.fillHeight: true
                color: "blue"
                Text{
                    anchors.centerIn: parent
                    color: "white"
                    text: person.name + " " + person.age
                }
                Person{
                    id: person
                    name: "老王"
                    age: 23
                }
            }
            Rectangle{
                id: rect_1
                Layout.preferredHeight: 240
                Layout.preferredWidth: columnLayout.width
                Layout.fillHeight: true
                color: "red"
                Text{
                    anchors.centerIn: parent
                    color: "white"
                    text: person_1.name + " " + person_1.age
                }
                Person{
                    id: person_1
                }
            }
        }
    }
}

注意: 在写完 如下代码后 Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) 可以将鼠标光标放在 Q_PROPERTY上,然后 组合键alt + enterQtCreator就可以自动生成代码。在QML中注册C++类型适合于要重复使用的情况

标签:name,int,age,C++,Person,QML,交互,void,QString
From: https://blog.51cto.com/u_15885923/7062570

相关文章

  • C++互斥锁
    C++11提供了4种锁机制mutex:互斥锁timed_mutex:带超时机制的互斥锁recursive_mutex:递归互斥锁recursive_imed_mutex:带超时机制的递归互斥锁!使用前需添加头文件#include<mutex>metex:使用伪代码方式mutexmtx;mtx.lock();//申请加锁。(需要加锁的资源)mtx.unlo......
  • C++通用学习速成判定
    C++的继承【C++】继承_c++继承_风继续吹TT的博客-CSDN博客#include<iostream>#include<string>usingnamespacestd;classPerson{public: voidPrint() { cout<<"_name_age_sex"<<endl; }protected: string_name; int_age; char......
  • C C++ Java python HTML/CSS/JavaScript
    C/C++是一种底层的语言,它可以直接操作内存和硬件,运行速度很快,但是也很难学习和调试,容易出错。Java是一种面向对象的语言,它可以跨平台运行,有很多成熟的框架和库,适合做大型的企业级应用,但是也很繁琐和冗长,需要写很多代码。Python是一种高级的语言,它可以用简洁的语法来实现复杂的功能......
  • C++系列三:QT初识
    目录前言QT介绍前言开发环境,挺折腾人,一波三折。参考链接:C语言中文网、QT快速入门官方文档QT介绍跨平台的GUI。主要用于桌面程序开发和嵌入式开发。目前Qt的开源授权有两种,一种是GPL授权,另一种是LGPL授权QML主要用于手机移动应用程序Windows下的GUI解决方案......
  • C++系列二:STL教程-迭代器
    目录前言迭代器前言……。迭代器//它可以是需要的任意类型,通过迭代器可以指向容器中的某个元素,如果需要,还可以对该元素进行读/写操作。常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器5种。输入迭代器和输出迭代器比较特殊,它......
  • 浅析C++gnu pbds库
    pbds俗称平板电视,__gnu_pbds自带了封装好了的平衡树、字典树、hash数据结构,速度快过\(STL\)Ⅰ.引入想要使用\(pbds\),必须先要添加头文件,\(pbds\)并不属于bits/stdc++.h的一部分,所以也只能在\(g++\Mingw64\)的环境下食用。以下是头文件:#include<bits/extc++.h>以下是命名空......
  • RichEdit 选中文本的高亮显示 VC++
    RichEdit控件失去焦点后,选中文本不再高亮显示。有两种方法可以改变,使得控件失去焦点仍然保持高亮:方法一:创建控件时设置ES_NOHIDESEL风格m_hWndREdit=CreateWindow(_T("RichEdit20W"),NULL,//RICHEDIT_CLASSRichEdit20ARichEdit20WWS_CHILD|WS_VISIBLE|ES......
  • C++实现一键关闭桌面
    方法一:C++关闭桌面,explorer.exe#include<Windows.h>#include<TlHelp32.h>#include"resource.h"#pragmawarning(disable:4996)voidtaskkill(constchar*name){ HANDLEinfo_handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//拍摄系统中所有进......
  • c++11特性汇总
    c++11/14/17新特性参考C++11系列-什么是C++11大丙教程目录1、关键字及新语法1.1、auto关键字及用法1.2、nullptr关键字及用法1.3、for循环语法2、智能指针内存管理2.1、std::shared_ptr2.2、std::weak_ptr2.3、std::unique_ptr3、文件IO3.1、标准......
  • C++快速排序
    快速排序介绍:基础思路:首先快速排序是由冒泡排序所改进的,都是通过多次比较和交换来实现排序,但快速排序是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,分别对这两部分记录继续进行排序,以达到整个序列有序。思路详解:(1)首先我们先设定......