2015-01-09 107 views
0

在我的Qt快速(QT V5.4和QtQuick 2.4)的項目,我有這五個.qml文件:在同一個文件中實現多個窗口的功能?

  1. MainForm.ui.qml - 它包含應用程序
  2. main.qml的主窗口 - 包含mainForm.ui.qml對象的所有功能實現,例如onClicked事件,調用C++函數從textInputs等獲取值。

問:我當前的實現功能的設置是否正確?或者我應該在同一個文件中實現所有這些東西?

  • dialog1.qml - 包含一些設置等
  • dialog2.qml一些文本輸入 - 對於一些列表和表在我的申請。
  • dialog3.qml - 還包含一些C++函數的對象。
  • 所有這些qml文件都是在不同時間點擊不同按鈕創建和銷燬的。我用這個方法來打開一個對話框

    `addMenuArea.onClicked: { 
    Qt.createComponent("addMenuAppDialog.qml").createObject(rootWindow, {}); 
    }` 
    

    以及銷燬對話框:

    MouseArea{ 
        anchors.fill: parent 
        onClicked: { 
         dialogComponent.destroy() 
        } 
    } 
    

    現在目前這些對話沒有任何功能,如主窗口,我想要做的如果可能的話,將它全部在一個文件(main.qml)中實現而不用任何javascript。我沒有關於如何鏈接所有對話框和main.qml的想法,所以我可以在main.qml中添加這些功能。任何幫助都會很棒!

    +0

    哪個qt和哪個qt-quick?版本信息丟失。 – user1095108

    +0

    @ user1095108編輯問題,看看! –

    +0

    這是一種可能的方法。另一種方法是使用'Loader'並更改源文件名。這將處理對象的創建/銷燬。第三種方法是實例化所有的對話框並隱藏除了應該可見的對話框之外的所有對話框,但是這會使用比需要更多的內存。 – saiarcot895

    回答

    1

    假設你有一個SimpleDialog.qml文件:

    Window { //or Item, Rectangle, ... whatever 
        signal userPressedSomething() 
        property string userNameString 
        function textEditText(){ /*return textEdit.text()*/ } 
        //... 
    } 
    

    ,並假設你main.qml具有以下功能,其嘗試處理必要的程序邏輯:

    1. openSimpleDialog()加載SimpleDialog
    2. closeSimpleDialog()關閉SimpleDialog
    3. userPressedSomethingInSimpleDialog()
    4. getSimpleDialogInfo()

    您可以使用Loader從該對話框中加載,卸載,獲取數據,並使用Connections捕捉信號。這裏是main.qml一個簡單的例子:

    Loader { id: simpleDialogLoader } 
    
    function openSimpleDialog() { simpleDialogLoader.source = "SimpleDialog.qml"; } 
    
    function closeSimpleDialog() { simpleDialogLoader.source = ""; } 
    
    function getSimpleDialogInfo() { 
        if (simpleDialogLoader.source !== "SimpleDialog.qml") { return; } 
        console.log(simpleDialogLoader.item.userNameString); //property 
        console.log(simpleDialogLoader.item.textEditText()); //function 
    } 
    
    Connections { 
        target: simpleDialogLoader //to Loader 
        onUserPressedSomething: { userPressedSomethingInSimpleDialog(); } 
    } 
    

    讓我們來解釋一下細節:

    • 使用Loader.source財產動態加載/卸載在openSimpleDialogcloseSimpleDialog功能SimpleDialog
    • Loader.item包含由加載器創建的對象,這是所有getSimpleDialogInfo需求。
    • 來自SimpleDialogcan be caught的信號通過將Connections.target設置爲Loader.item。
    +0

    謝謝!如果我想實現一個函數,當simpleDialog.qml中的某個按鈕發生改變時,它會改變一些文本或某種顏色,正如我所說的我想在main.qml中實現的那樣?另外我想知道如何添加按鈕時,按下simpleDialog.qml按鈕時是否獲得滑塊或「textEdit」的值?我想在C++函數中使用這些值作爲參數? –

    +0

    如果您想在用戶按main.qml中的某些內容時更改SimpleDialog.qml中的某些文本,請嘗試使用'getSimpleDialogInfo'方法。另一方面,當用戶在SimpleDialog.qml中按下某些內容時,如果您想要更改main.qml中的某些文本,請嘗試'Connections'方法(SimpleDialog應該明確發出信號)。在這兩種情況下都不需要C++。 – mcchu

    1

    儘管您可以在main.qml文件中定義所有對話框和主窗口,但我強烈建議您不要採用這種方法。隨着對話框和主窗口的複雜性增加(它們肯定將變得更加複雜),您的QML代碼將變得越來越難以理解。

    Qt.createComponent("addMenuAppDialog.qml").createObject(rootWindow, {}) 
    

    涉及加載QML文件從硬盤驅動器,所以我不建議您調用它每次鼠標點擊。我建議2種方法的替代方案。

    替代1

    創建你的主窗口內的每個對話框組件:通過調用dialog1Component.createObject(rootWindow, {})

    Component { 
        id: dialog1Component 
        Dialog1 {} 
    } 
    

    然後你就可以創建它,你仍然需要destroy它關閉時手動。

    替代2

    這是在我的應用程序用來呈現對話框的方法。

    創建對話框聲明(將它放在你的主窗口內):

    MainWindow { 
        Dialog1 { 
         id: dialog1 
        } 
    } 
    

    然後你就可以通過調用dialog1.open()表現出來,並通過調用dialog1.close()將其隱藏。

    +0

    謝謝!在替代方案2中,可以使用自己的自定義樣式添加自定義QML組件,如「ListView」或TextInputs,或使用其他qml文件作爲組件? –

    +0

    @EdwardMckinzie是的,你絕對可以做一些像'MainWindow {Dialog1 {TextInput {/ *等等等等}//} – tonytony

    相關問題