QML用同一模版多開主視窗
阿新 • • 發佈:2021-07-16
如何動態地建立多個長的一樣的主視窗哪(資料當然不一樣), 用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
本文來自部落格園,作者:飛雲~,轉載請註明原文連結:https://www.cnblogs.com/cnscud/p/15020507.html