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

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

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/part1.qml")); engine.load(url);
//多次调用
engine.load(url); return app.exec();

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

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

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

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

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

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

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

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

例如, 修改listView的model数据:

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

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

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

视图QML部分:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.5 import MyList 1.0 Window {
id: rectangle1
visible: true
width: 340
height: 280
objectName: "window" property string keyname: "whoknows" ListView{
width: 100; height: 100 id: listView
objectName: "listView" Layout.fillWidth: true
Layout.fillHeight: true //默认数据为空, 但是声明了类型
model: MyListModel{} delegate: Rectangle {
height: 25
width: 100
Text { text: "hello " + model.name }
} } }

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

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

最新文章

  1. [转]DevExpress v13.2 Beta版重要更新
  2. 【转】C++怎么读写windows剪贴板的内容?比如说自动把一个字符串复制.
  3. mac OSX 上 brew install hive
  4. eclipse luna 安装 Hadoop 1.2.1 eclipse-plugin
  5. vim 代码
  6. 我的日常工具——gdb篇
  7. ThinkPHP中U方法与url的四种访问模式
  8. Android设置定时执行执行一次任务
  9. java生成指定范围的随机数
  10. SQL Server 储存过程的output 参数
  11. javascript addEventListener方法
  12. MaidSafe.net,一个完全去中心的化的云存储系统
  13. 基础汇编指令(16bit 32bit 64bit)
  14. python使用mysql
  15. python的time
  16. .net反编译的九款神器
  17. Linux 磁盘管理命令
  18. pandas 读取大文件 read_table C-engine CParserError: Error tokenizing data
  19. 164. Maximum Gap (Array; sort)
  20. mongodb常用操作命令(待续)

热门文章

  1. DOS命令行(1)——Windows目录与文件应用操作
  2. Java安全之Weblogic内存马
  3. 解决git同步每次都需要输入用户名、密码
  4. Datahub 0.8.5发布! 通用的元数据搜索和发现工具
  5. Vue 全局组件
  6. Java核心基础第2篇-Java基本语法
  7. Network:java中文转byte出现负数问题
  8. docker安装mysql镜像和容器
  9. js 简单实现获取短信按钮倒计时60秒
  10. bugku flag在index里面