1. 程式人生 > 其它 >QML用同一模版多開主視窗

QML用同一模版多開主視窗

如何動態地建立多個長的一樣的主視窗哪(資料當然不一樣), 用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