如何动态地创建多个长的一样的主窗口哪(数据当然不一样), 用QML也是可以实现的.

简单的地说, 就是调用多次load即可.

  1. QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  2. QGuiApplication app(argc, argv);
  3. QQmlApplicationEngine engine;
  4. const QUrl url(QStringLiteral("qrc:/part1.qml"));
  5. engine.load(url);
  6. //多次调用
  7. engine.load(url);
  8. return app.exec();

那多开了多个窗口之后, 如何设置不同的数据哪? 如何区分不同的窗口哪

  1. QObject *rootObj1 = engine.rootObjects()[0];
  2. QObject *rootObj2 = engine.rootObjects()[1];

就可以找到刚刚创建的窗口, 以及里面的控件, 例如下面修改输入框的文字和颜色

  1. //直接修改控件属性: 控件的objectName为 textInput, 如果只有一个TextInput, 则省略参数
  2. QQuickItem *textInput2 = rootObj1->findChild<QQuickItem*>("textInput");
  3. if (textInput2){
  4. textInput2->setProperty("text", "I am second one");
  5. textInput2->setProperty("color", QColor(Qt::blue));
  6. }

之前我们用ListView的时候, 设置的setContextProperty该如何独立设置哪?

  1. engine.rootContext()->setContextProperty("myModel", &model);

经过试验, 发现这个rootContext独一份, 也就是说这是全局统一的rootContext,而通过contextForObject获取的Context是只读的, 没有办法修改.

那看来就只能通过控件本身的setProperty修改了

例如, 修改listView的model数据:

  1. QQuickItem *listView1 = rootObj1->findChild<QQuickItem*>("listView");
  2. if (listView1){
  3. qDebug("find listview1");
  4. listView1->setProperty("model", QVariant::fromValue(model1));
  5. }

注意, 为了声明ListView的Model的数据类型, 需要做一些定义

  1. //注册类型: 让视图知道注入的是啥类型
  2. qmlRegisterType<MyListModel>("MyList", 1, 0, "MyListModel");

视图QML部分:

  1. import QtQuick 2.12
  2. import QtQuick.Window 2.12
  3. import QtQuick.Layouts 1.3
  4. import QtQuick.Controls 2.5
  5. import MyList 1.0
  6. Window {
  7. id: rectangle1
  8. visible: true
  9. width: 340
  10. height: 280
  11. objectName: "window"
  12. property string keyname: "whoknows"
  13. ListView{
  14. width: 100; height: 100
  15. id: listView
  16. objectName: "listView"
  17. Layout.fillWidth: true
  18. Layout.fillHeight: true
  19. //默认数据为空, 但是声明了类型
  20. model: MyListModel{}
  21. delegate: Rectangle {
  22. height: 25
  23. width: 100
  24. Text { text: "hello " + model.name }
  25. }
  26. }
  27. }

其中 MyListModel 是一个继承自 QAbstractListModel的模型类, 此处仅为演示, 完整的类需要考虑增删修改等各种函数实现.

项目代码: https://github.com/cnscud/learn/tree/master/qt/multiplewindows

QML用同一模版多开主窗口的更多相关文章

  1. 【转】【WPF】WPF 登录窗口关闭时打开主窗口

    在WPF中设计登录窗口关闭时打开主窗口,自动生成的App.xaml不能满足要求, 1.把App.xaml的属性窗口中的生成操作设定为 无 2.添加Program类 static class Progr ...

  2. QML用Instantiator动态创建顶级窗口

    关键点 使用Model驱动Instantiator QML里面的hashmap: QQmlPropertyMap 上一次说到用 QQmlApplicationEngine 多次load的方式创建多个一 ...

  3. C# WPF 建立无边框(标题栏)的登录窗口

    前言:笔者最近用c#写WPF做了一个项目,此前未曾做过完整的WPF项目,算是一边学一边用,网上搜了不少资料,效率当然是不敢恭维的,有时会在一些很简单的问题上纠结很长时间,血与泪的教训可不少. 不过,正 ...

  4. 由基于qml,c++的串口调试工具浅谈qml与c++混合编程

    最近在做一个基于sim900 的串口通信工具,基于qml和c++来实现. 首先,对于串口,qt有自带的QSerialPort,可以实现同步,和异步通信,qt creator也有自带的例子,本例子是从其 ...

  5. PYQT窗口托盘目录

    #UI.py,通过UI设计师制作后直接转换为UI.py脚本 # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui try:    _fromU ...

  6. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516 ...

  7. Android--Activity(活动)

    1. 安卓中的 Activity 大致等于桌面应用中的window 2. Activity 的生命周期由系统控制, 所以在开发时要假设 Activity 会被随时销毁掉的情况, 比如: 应用中有一个 ...

  8. matlab GUI界面编程总结

    去年做了一些关于Matlab GUI的程序,现在又要做相关的东西,回想起来,当时很多经验没有记录下来,现在回顾起来始终觉得不爽,所以从现在开始,一定要勤写记录. 从简单的例子说起吧. 创建Matlab ...

  9. 使用OpenCV&&C++进行模板匹配.

    一:课程介绍 1.1:学习目标 学会用imread载入图像,和imshow输出图像. 用nameWindow创建窗口,用createTrackbar加入滚动条和其回调函数的写法. 熟悉OpenCV函数 ...

随机推荐

  1. HashMap 中7种遍历方式的性能分析

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  2. CloudCanal

    CloudCanal 是一款数据迁移同步工具,帮助企业快速构建高质量数据流通通道,产品包含 SaaS 模式和私有输出专享模式.开发团队核心成员来自大厂,具备数据库内核.大规模分布式系统.云产品构建背景 ...

  3. python数字游戏

    import random a=random.randint(1,10) b=0 num=3 while num>0:    print("你还有"+str(num)+&qu ...

  4. 4.5 RNN循环神经网络(recurrent neural network)

     自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1  RNN循环神经网络 ...

  5. 三剑客-awk

    1.作用特点 排除信息 查询信息 统计信息 替换信息 2.语法格式 awk [参数] '模式-动作' 文件 3.awk命令执行原理 4.命令使用方法 创建测试环境 [root@shuai ~]# ca ...

  6. SpringBoot | 1.3 约定编程Spring AOP

    前言 前面聊过Spring的一个很重要的概念,IoC控制反转,接下来就是AOP了: 1. AOP切面编程 面向切面编程,是利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度 ...

  7. 24 shell 管道命令与过滤器

    1.管道命令的用法 2.使用管道命令的好处: 3.重定向和管道的区别 4.Linux管道实例 5.管道与重定向 1)管道与输入重定向 2)管道与输出重定向 6.过滤器 7.过滤器举栗 1.管道命令的用 ...

  8. Macbook(M1版)的用户看过来,.net 6 Preview 6支持Apple Silicon for macOS

    本文由葡萄城技术团队翻译 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 我们很高兴发布.NET6预览的第6版,本次预览是倒数第二次预览了.在本次预览发布之 ...

  9. C语言:char讲解与例子

    #include <stdio.h> main() { char bla,blb,blc;//声明或定义三个字符型变量,变量名为bla,blb,blc //字符型数据用标识符char来标识 ...

  10. Java基础00-字符串14

    1. API 1.1 API概述 2. String String常用类的常用方法 String字符串变量的创建: 声明:    String 变量名; String str; 声明并初始化: Str ...