当前位置: 首页 > news >正文

做我的世界壁纸的网站最好的 受欢迎的 免费的

做我的世界壁纸的网站,最好的 受欢迎的 免费的,建设部住房城乡建设厅网站,关于企业网站建设Qt quick能够生成非常绚丽界面#xff0c;但有其局限性的#xff0c;对于一些业务逻辑和复杂算法#xff0c;比如低阶的网络编程如 QTcpSocket #xff0c;多线程#xff0c;又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等#xff0c;在 QML 中要么不可…        Qt quick能够生成非常绚丽界面但有其局限性的对于一些业务逻辑和复杂算法比如低阶的网络编程如 QTcpSocket 多线程又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等在 QML 中要么不可用要么用起来不方便所以就有了quick和C混合编程的需求。 原理和方法 简单来说混合编程就是通过Qml高效便捷的构建UI界面而使用C 来实现业务逻辑和复杂算法。Qt集成了QML引擎和Qt元对象系统使得QML很容易从C 中得到扩展在一定的条件下QML就可以访问QObject派生类的成员例如信号、槽函数、枚举类型、属性、成员函数等。 要想在Qml中访问C 对象必然要找到一种方法在两者之间建立联系而Qt中提供了两种在 QML 环境中使用C 对象的方式 在C 中实现一个类注册到Qml环境中Qml环境中使用该类型创建对象在C 中构造一个对象将这个对象设置为Qml的上下文属性在Qml环境中直接使用该属性 两种方式之间的区别是第一种可以使C 类在QML中作为一个数据类型例如函数参数类型或属性类型也可以使用其枚举类型、单例等功能更强大。 QML可以访问的C 类 先来看第一种方式C类要想被QML访问首先必须满足两个条件一是派生自QObject类或QObject类的子类二是使用Q_OBJECT宏。QObject类是所有Qt对象的基类作为Qt对象模型的核心提供了信号与槽机制等很多重要特性。Q_OBJECT宏必须在private区C默认为private声明用来声明信号与槽使用Qt元对象系统提供的内容位置一般在语句块首行。我们还是新建一个Qt quick工程然后我们一点一点的来看如何实现可以被QML访问的C类。首先肯定是需要构建一个类 信号和槽 只要是信号和槽都可以在 QML 中访问可以把 C 对象的信号连接到 QML 中定义的方法上也可以把 QML 对象的信号连接到 C 对象的槽上还可以直接调用 C 对象的槽或信号……所以这是最简单好用的一种途径。 在mixing.h文件中定义一个信号和一个槽函数 #ifndef MIXING_H #define MIXING_H #include QObject #include QColor class Mixing : public QObject {Q_OBJECT public:explicit Mixing(QObject *parent nullptr); signals:void colorChanged(const QColor color); public slots:void start(); }; #endif // MIXING_HMixing类中的信号colorChanged()和槽函数start都可以被Qml访问但是注意槽必须被声明为public或protected而且信号在 C 中使用时要用到emit关键字但是在Qml中就是个普通的函数。我们想要实现的效果是点击鼠标改变窗体颜色看一下信号和槽是如何在Qml和 C中传递的。 在mixing.cpp中声明槽函数 #include mixing.h #include QDebugMixing::Mixing(QObject *parent) : QObject(parent) {}void Mixing::start() {qDebug() start;emit colorChanged(Qt::blue); } 这里传递了一个颜色到Qml中当然现在我们肯定还无法在qml文件中使用Mixing类那么如何将Mixing类注册为Qml类型呢其实有很多办法我们这里就举一个最常规的注册类型qmlRegisterType。它比较常见的原型 templatetypename T int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) 模板参数typename 就是你要实现的 C 类的类名。它的第一个参数uri 让你指定一个唯一的包名类似Java 中的那种一是用来避免名字冲突二是可以把多个相关类聚合到一个包中方便引用。比如我们常写这个语句 import QtQuick.Controls 2.3 其中的 QtQuick.Controls 就是包名 uri 而2.3则是版本是versionMajor和versionMinor的组合。 qmlName则是 QML中可以使用的类名。 我们通过qmlRegisterType将Mixing注册为qml类型修改main.cpp文件 #include QGuiApplication #include QQmlApplicationEngine #include QtQml #include mixing.hint main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);qmlRegisterTypeMixing(an.qt.Mixing, 1, 0, Mixing);QQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral(qrc:/main.qml)));if (engine.rootObjects().isEmpty())return -1;return app.exec(); } 我们把Mixing类注册成为Qml类型Mixing主版本是1次版本是0包名是an.qt.Mixing。注意注册动作一定要放在 QML 上下文创建之前否则的话注册是没有用的。 接下来我们就可以在qml文件中导入Mixing类并且使用它了。 import QtQuick 2.9 import QtQuick.Window 2.2 import an.qt.Mixing 1.0Window {id:rootvisible: truewidth: 640height: 480title: qsTr(mixing)MouseArea{anchors.fill: parentonClicked: {mixing.start()}}Mixing{id: mixingonColorChanged: {root.color color}} } Mixing这时就像Qml中一个普通的类型一样使用了点击鼠标调用Mixing中的start函数输出“start”,改变窗体的颜色为蓝色。 枚举类型 如果想要在注册的类中使用枚举类型可以使用Q_ENUMS 宏将该枚举注册到元对象系统中。修改mixing.h文件 class Mixing : public QObject {Q_OBJECTQ_ENUMS(BALL_COLOR)public:explicit Mixing(QObject *parent nullptr);enum BALL_COLOR{BALL_COLOR_YELLOW,BALL_COLOR_BLUE,BALL_COLOR_GREEN,};signals:void colorChanged(const QColor color);public slots:void start(BALL_COLOR ballColor); }; 我们注册了枚举类型之后在Qml中就可以用 ${CLASS_NAME}.${ENUM_VALUE} 的形式来访问了。看一下qml文件中的内容。主要修改的是MouseArea部分。 MouseArea{anchors.fill: parentacceptedButtons:Qt.LeftButton | Qt.RightButton;onClicked: {if(mouse.button Qt.LeftButton){mixing.start(Mixing.BALL_COLOR_BLUE)}else if(mouse.button Qt.RightButton){mixing.start(Mixing.BALL_COLOR_GREEN)}}onDoubleClicked: {mixing.start(Mixing.BALL_COLOR_YELLOW)} } 从上面的代码可以看出调用枚举类型的方法形如Mixing.BALL_COLOR_BLUE注意前面是类名哦不是设置的id。我们这次要实现的效果是点击鼠标左键窗口颜色变蓝点击鼠标右键窗口颜色变绿双击鼠标窗口颜色变黄。 然后将逻辑处理部分写到mixing.cpp文件。 void Mixing::start(BALL_COLOR ballColor) {QColor color;qDebug() start;switch (ballColor) {case BALL_COLOR_BLUE:color Qt::blue;break;case BALL_COLOR_GREEN:color Qt::green;break;case BALL_COLOR_YELLOW:color Qt::yellow;break;}emit colorChanged(color); } 用了一个switch选择器来实现颜色的切换。效果如下 C 类的属性和成员函数 在定义一个类的成员函数时使用Q_INVOKABLE宏来修饰但是注意的是在QML中访问的前提是public或protected成员函数而且这个宏必须放在返回函数前面。 而定义属性则需要使用Q_PROPERTY 宏通过它定义的属性可以在 QML 中访问、修改也可以在属性变化时发射特定的信号。要想使用 Q_PROPERTY 宏定义的类必须是QObject的后裔必须在类首使用Q_OBJECT宏。 Q_PROPERTY宏的原型 Q_PROPERTY(type name(READ getFunction [WRITE setFunction] |MEMBER memberName [(READ getFunction | WRITE setFunction)])[RESET resetFunction][NOTIFY notifySignal][REVISION int][DESIGNABLE bool][SCRIPTABLE bool][STORED bool][USER bool][CONSTANT][FINAL]) 属性的type、name是必需的其它是可选项最常用的有READ、WRITE、NOTIFY。属性的type可以是QVariant支持的任何类型也可以是自定义类型包括自定义类、列表类型、组属性等。另外属性的READ、WRITE、RESET是可以被继承的也可以是虚函数这些特性并不常用。 READ读取属性值如果没有设置MEMBER的话它是必需的。一般情况下函数是个const函数返回值类型必须是属性本身的类型或这个类型的const引用没有参数。WRITE设置属性值可选项。函数必须返回void有且仅有一个参数参数类型必须是属性本身的类型或这个类型的指针或引用。NOTIFY与属性关联的可选信号。这个信号必须在类中声明过当属性值改变时就可触发这个信号可以没有参数有参数的话只能是一个类型同属性本身类型的参数用来记录属性改变后的值。 我们从代码中看一下如何定义修改mixing.h文件 class Mixing : public QObject {Q_OBJECTQ_ENUMS(BALL_COLOR)Q_PROPERTY(unsigned int number READ Number WRITE setNumber NOTIFY Numberchanged)public:explicit Mixing(QObject *parent nullptr);enum BALL_COLOR{BALL_COLOR_YELLOW,BALL_COLOR_BLUE,BALL_COLOR_GREEN,};unsigned int Number() const;void setNumber(const unsigned int Number);Q_INVOKABLE void stop();signals:void colorChanged(const QColor color);void Numberchanged();public slots:void start(BALL_COLOR ballColor);private:unsigned int m_Number; } 可以看到我们通过Q_INVOKABLE修饰了stop函数。通过Q_PROPERTY修饰了名为number的属性number通过Number函数读得数据通过setNumber函数写入数据触发信号是Numberchanged函数。在cpp文件中写这几个函数的内容。 unsigned int Mixing::Number() const {return m_Number; }void Mixing::setNumber(const unsigned int number) {if(number ! m_Number){m_Number number;emit Numberchanged();} }void Mixing::stop() {qDebug() 颜色改变啦; } 接下来我们就可以在Qml中调用函数和属性了打开界面什么都不做时会输出number的初始值因为没有为其初始化所以大家返回的数据可能不一定为0。双击时会设置number的值这里我们设置的是10主要就是通过setNumber来写数的。当number的值改变会触发Numberchanged信号发射出去。所以还需要在Qml中写一个信号处理函数也是输出number的值不过现在输出的就是改变之后的number了。 MouseArea{anchors.fill: parentacceptedButtons:Qt.LeftButton | Qt.RightButton;onClicked: {if(mouse.button Qt.LeftButton){mixing.start(Mixing.BALL_COLOR_BLUE)}else if(mouse.button Qt.RightButton){mixing.start(Mixing.BALL_COLOR_GREEN)}}onDoubleClicked: {mixing.start(Mixing.BALL_COLOR_YELLOW)mixing.number 10;} }Mixing{id: mixingonColorChanged: {root.color colormixing.stop(color)}Component.onCompleted:{console.log(default ball number is, number)}onNumberChanged:{console.log(new ball number is, number) } }
http://www.dnsts.com.cn/news/162207.html

相关文章:

  • 专业网站建设推荐q479185700顶上网站设计 广西
  • 门户网站建设公司哪家好如何统计网站访问量
  • 网站注册协议系统开发生命周期
  • 百度网站分析网页制作网站图片
  • asp 网站地图生成丹江口网站制作
  • 绵阳住房和城乡建设局网站天津省网站制作厂家
  • 网站后台在哪里网站建设 本溪红海传媒
  • 凡科建站怎么保存网站app定制开发免费
  • 网站开发工作基础网页制作三剑客专家培训教程
  • 顺企网属于什么网站企业自助网站建设
  • 银行网站建设前期合同阅读网站怎样做
  • 做外汇的网站在线名片设计
  • 查询网站访问量响应式网站建设必推全网天下
  • asp.net电子商务网站前台模板西宁做网站君博美评
  • 外贸网站建设网站优化广告艺术设计专业
  • 网站开发框架的主要作用wordpress 帮助手册
  • o2o网站系统建设深圳城乡和住房建设局网站首页
  • 营销型网站源码下载wordpress网页和软件
  • 网站开发 后端返回前端一个地址 有什么用中企动力网站icp备案通知
  • perl 网站开发做动效的网站
  • 黟县网站建设深圳画册设计公司排名
  • 如何网上建设网站北京的网站建设公司
  • 网站前后端用什么软件做域名买好怎么开始做网站
  • 郑州做网站公司有哪些外海网站如何做网站的推广
  • 做定制校服的网站绍兴柯桥哪里有做网站的
  • 家居网站建设 百度文库深圳工业设计大展2021
  • 金华网站制作费用设计师学习网站
  • 郑州市金水区建设局官方网站阳泉建设公司网站
  • 网站建设所需技术县级林业网站建设管理
  • 学习网站建设要什么学历各大网站响应生态建设