QT QUICK 2 : QML与后端C++组建类MVVM结构工程最小化实现

一、采用QT对方法提供的宏进行结构MVVM的构建

1.打开QT ,并创建QT-QUICK 工程,建议QT5.15及以上

2.准备 类 MyObject  其实这个类就可以作为VM使用

myobject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H#include <QObject>class MyObject : public QObject
{Q_OBJECT
public:explicit MyObject(QObject *parent = nullptr);Q_INVOKABLE QString func(QString str);//需要调用的函数//单例static MyObject* getInstance(){static MyObject* myobj = new MyObject() ;return myobj;};int iValue() const;void setIValue(int newIValue);const QString &sString() const;void setSString(const QString &newSString);signals:void iValueChanged();void sStringChanged();private:int m_iValue;		//针对变量 alt+enter 会自动创建一系列相关方法和宏定义QString m_sString="init";//signals://这里的通知动作iValueChanged sStringChanged非常重要,是属性变化后 通知前端做同步的核心Q_PROPERTY(int iValue READ iValue WRITE setIValue NOTIFY iValueChanged)Q_PROPERTY(QString sString READ sString WRITE setSString NOTIFY sStringChanged)
};#endif // MYOBJECT_H

myobject.cpp

#include "myobject.h"
#include <QDebug>MyObject::MyObject(QObject *parent): QObject{parent}
{}//需要调用的函数 
//这里有个重点  必须采用setSString方法来设置sString的值,这样才能启动通知,等号赋值不会通知前端
QString MyObject::func(QString str)
{setSString(sString()+ str + '#' ) ;// m_sString = str+"@";qDebug()<< __FUNCTION__ <<" === "<<str;return sString();
}int MyObject::iValue() const
{return m_iValue;
}void MyObject::setIValue(int newIValue)
{if (m_iValue == newIValue)return;m_iValue = newIValue;emit iValueChanged();
}const QString &MyObject::sString() const
{return m_sString;
}void MyObject::setSString(const QString &newSString)
{if (m_sString == newSString)return;m_sString = newSString;emit sStringChanged();
}

3 main.cpp中连接创建的类

main.cpp  如果版本较新则采用注册单例qmlRegisterSingletonInstance方式进行 

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "myobject.h"int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication app(argc, argv);QQmlApplicationEngine engine;//关键//qmlRegisterSingletonInstance( "MyObj",1,0,"MyObjectIns",MyObject::getInstance());const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}

4 qml部分  作为view

main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.5
import MyObj 1.0Window {width: 640height: 480visible: truetitle: qsTr("Hello World")onWidthChanged: { console.log(width) }//ref动态绑定 由于iValue定义了通知动作;//一个改变 会通知另一个改变  建议用此承接前端属性property string sstring: MyObjectIns.sStringText {id: txttext: sstring}Button {objectName: "myButton"width:100height:100y:100onClicked: {MyObjectIns.func("ee")console.log ( MyObjectIns.sString)console.log (txt.text)console.log (sstring)}}
}

其他后续问题

可见目前只是通过按钮修改后台数据,并在view绑定了前端的属性进行同步变化;

那么如果我需要改变通知的是个表格呢?

我们可能需要采用更加复杂的数据结构和复杂的更新机制;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

释放创造力,低成本实现您的梦想应用 —— 尽在我们的开源低代码平台!

在数字化时代&#xff0c;每个企业都渴望拥有自己的专属应用&#xff0c;但传统开发模式的高成本和技术壁垒让许多梦想搁浅。现在&#xff0c;我们为您带来了革命性的解决方案 —— 一个开源、免费、且功能强大的低代码开发平台&#xff01; 为什么选择我们的低代码平台&#…

任务修复实例(9)

Quest Name Breaking the Chain | 斩断链条 Quest ID 25167 -- Delete Creature Spawned DELETE FROM world.creature WHERE id IN (39251,39245,39249); -- Adjust Creature States UPDATE world.creature_template SET npcflag 16777216, AIName SmartAI WHERE entry …

在线教育系统怎么运营,教育机构转化模型分析

做增长的都会明白&#xff0c;付费用户的增长才是关键&#xff0c;而且还是规模化的增长&#xff0c;毕竟拉新只是第一步&#xff0c;最重要的一步还在于如何转化。况且&#xff0c;很多人会选择尝试付费推广&#xff0c;这部分渠道用户要怎么引导购买产品&#xff0c;才能抵消…

QGraphicsView实现简易地图12『平移与偏移』

前文链接&#xff1a;QGraphicsView实现简易地图11『指定层级-定位坐标』 提供地图平移与偏移功能。地图平移是指将地图的中心点更改为给定的点&#xff0c;即移动地图到指定位置。地图偏移是指将当前视口内的地图向上/下/左/右/进行微调&#xff0c;这里偏移视口宽/高的四分之…

【C++】GNU Debugger (GDB) 使用示例

文章目录 GDB 使用示例GDB的常用命令示例 GDB 使用示例 GDB的常用命令 GDB&#xff08;GNU Debugger&#xff09;是一种Unix下的程序调试工具&#xff0c;用于调试C、C等编程语言编写的程序。以下是一些GDB的常用命令&#xff1a; 启动和退出&#xff1a; run 或 r&#xf…

【ArcGIS 脚本工具】格式化简单渲染图层或图层组

CAD加GIS是规划人的黄金搭档&#xff0c;不可偏废。 小编通常直接在ArcPro中加载CAD查看&#xff0c;这样可以保证CAD修改之后GIS能同步更新显示。 但是CAD在ArcPro中的显示多少有点水土不服。 比如湘源地块在ArcPro3.0中显示时会自动加上透明度&#xff0c;虽然这样可以看到…

汇集全球顶级AI的自助平台

1、介绍:此平台以其开放和便捷的特性,为用户提供了一个无需月费的 AI 服务入口。咱可以根据自己的需求,灵活选择和付费使用平台上的 AI 技术。 该平台强调的核心优势在于 “零门槛” 和 “按需付费”,意味着用户不需要进行大额预付或者承担长期的固定费用,而是可以根据实际…

利用爬虫解决数据采集难题

文章目录 安装为什么选择 BeautifulSoup 和 requests&#xff1f;安装 BeautifulSoup 和 requests解决安装问题 示例总结 在现代信息时代&#xff0c;数据是企业决策和发展的关键。然而&#xff0c;许多有用的数据分散在网络上&#xff0c;且以各种格式和结构存在&#xff0c;因…

设计模式学习(八)——《大话设计模式》

设计模式学习&#xff08;八&#xff09;——《大话设计模式》 单一职责原则 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;是软件开发中 SOLID 原则之一&#xff0c;由罗伯特C马丁&#xff08;Robert C. Martin&#xff09;提出。它指的是一个类…

Could not find the Qt platform plugin “dxcb“ in ““、 重点:是dxcb

这个重点就在于是dxcb不是xcb&#xff0c;让我一顿好找。 https://bugs.launchpad.net/ubuntu/source/deepin-qt5dxcb-plugin/bug/1826629 这篇文章描述了应该是deepin系统的一个问题&#xff0c;应该已经修复了不知道为什么我还会遇到。 不过知道是dxcb后直接去qtcreater里的系…

ROS 2边学边练(45)-- 构建一个能动的机器人模型

前言 在上篇中我们搭建了一个机器人模型(其由各个关节&#xff08;joint&#xff09;和连杆&#xff08;link&#xff09;组成)&#xff0c;此篇我们会通过设置关节类型来实现机器人的活动。 在ROS中&#xff0c;关节一般有无限旋转&#xff08;continuous&#xff09;,有限旋转…

Android 注解

自定义注解 注解原理 注解本质是一个接口&#xff0c;Java中所有注解都是继承了Annotation接口的 注解(…)&#xff1a;其实就是一个实现类对象&#xff0c;实现了该注解以及Annotation接口。

TB交易开拓者旗舰版自动交易的设置

本文针对TB交易开拓者旗舰版V6.0.7.0(期货程序化交易软件下载 - 交易开拓者),目前网上没有自动交易设置的完整教程&#xff0c;特写此篇。 1. 设置期货账户的自动登录和登出。点击菜单“文件/系统设置”&#xff0c;然后在“安全”tab做如下设置&#xff1a; 2 设置你的期货账…

C++向函数传递对象

C语言中&#xff0c;对象作为函数的参数和返回值的传递方式有 3 种&#xff1a;值传递、指针传递和引用传递。 1. 对象作为函数参数 把实参对象的值复制给形参对象&#xff0c;这种传递是单向的&#xff0c;只从实参到形参。因此&#xff0c;函数对形参值做的改变不会影响到实…

Sybase数据库分页查询(指定起始位置)

针对单表数据量过大的场景&#xff0c;分页查询必不可少。针对sybase数据库分页查询的案例全网稀少&#xff0c;特别是指定起始页的分页查询实现。 本文依靠实际开发场景&#xff0c;特此总结Sybase数据库分页查询&#xff08;指定起始位置&#xff09;。 目录 一、 SQL实现分…

视频号小店不直播怎么出单?这里面的秘密,一篇文章全曝光!

大家好&#xff0c;我是电商糖果 这两年关于视频号搞电商的话题度非常高&#xff0c;也吸引了很多商家入驻。 视频号因为背后巨大的私域流量池扶持&#xff0c;所以它的转化率非常高。 根据官方发出来的战报&#xff0c;我们也可以看出它的数据是翻倍增长。 在2024微信公开…

git对远程和本地分支进行重命名

要同时对Git的远程和本地分支进行重命名&#xff0c;你需要分几个步骤操作&#xff1a; 重命名本地分支 切换到其他分支&#xff1a;在重命名当前分支之前&#xff0c;确保你不在你想要重命名的那个分支上。你可以通过以下命令切换到另一个分支&#xff08;比如切换到master分…

5.06号模拟前端面试8问

5.06号模拟前端面试8问 1.promise如何实现then处理 在JavaScript中&#xff0c;Promise 是一个代表异步操作最终完成或失败的对象。它有三种状态&#xff1a;pending&#xff08;等待&#xff09;&#xff0c;fulfilled&#xff08;完成&#xff09;&#xff0c;rejected&…

红日靶场ATTCK攻击合集

工作繁忙&#xff0c;笔记更新的有比较慢&#xff0c;转到CSDN同步更新很麻烦&#xff0c;直接看原始的笔记吧。不足之处欢迎多多指点。 已经打完的靶场如下&#xff1a; 红日靶场ATT&CK1&#xff1a;https://blog.csdn.net/weixin_44288604/article/details/108172737红…

Java面试题:描述Exchanger类的用途以及如何用它来交换数据

在编程中&#xff0c;Exchanger 类通常是Java并发编程中用于线程间数据交换的一个类。它属于java.util.concurrent包&#xff0c;提供了一种在两个线程之间进行数据交换的机制。使用Exchanger&#xff0c;两个线程可以交换数据&#xff0c;每个线程都可以提供数据并接收对方的数…