QML用同一模版多开主窗口
2024-09-04 05:32:35
如何动态地创建多个长的一样的主窗口哪(数据当然不一样), 用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
最新文章
- [转]DevExpress v13.2 Beta版重要更新
- 【转】C++怎么读写windows剪贴板的内容?比如说自动把一个字符串复制.
- mac OSX 上 brew install hive
- eclipse luna 安装 Hadoop 1.2.1 eclipse-plugin
- vim 代码
- 我的日常工具——gdb篇
- ThinkPHP中U方法与url的四种访问模式
- Android设置定时执行执行一次任务
- java生成指定范围的随机数
- SQL Server 储存过程的output 参数
- javascript addEventListener方法
- MaidSafe.net,一个完全去中心的化的云存储系统
- 基础汇编指令(16bit 32bit 64bit)
- python使用mysql
- python的time
- .net反编译的九款神器
- Linux 磁盘管理命令
- pandas 读取大文件 read_table C-engine CParserError: Error tokenizing data
- 164. Maximum Gap (Array; sort)
- mongodb常用操作命令(待续)