2015-09-13 95 views
0

我想表現出一定的條件下DialogonCompleted一個對話框onCompleted不工作(處理這種狀況略 - 一個簡單的if條款)顯示如預期

main.qml

import QtQuick 2.2 
import QtQuick.Controls 1.0 

ApplicationWindow 
{ 
    id: appWindow 

    width: 480 
    height: 640 
    visible: true 


    StackView 
    { 
     id: stackView 
     anchors.fill: parent 
     // Implements back key navigation 
     focus: true 

     initialItem: Item 
     { 
      width: parent.width 
      height: parent.height 
      Button { onClicked: dialog.open() } 
      // ... 
      Component.onCompleted: dialog.open() 
     } 
    } 

    MyDialog {id: dialog } 
} 

MyDialog。 qml

import QtQuick 2.0 
import QtQuick.Dialogs 1.2 
import QtQuick.Layouts 1.0 
import QtQuick.Controls 1.0 

Dialog 
{ 
    id: root 

    title: "MyDialog" 
    standardButtons: Qt.NoButton 

    ColumnLayout 
    { 
     id: column 
     width: parent ? parent.width : 200 
     Label { text: "hello world"; Layout.fillWidth: true } 
    } 
} 

當我啓動我的應用程序時,屏幕變暗,並且Dialog的陰影出現,好像對話框有width == 0

有時(很少)對話框顯示正確。

如果我將Component.onCompleted行註釋掉並使用Button啓動對話框,它會正確顯示。

我在做什麼錯? 我使用Qt 5.5爲Android

回答

2

如果在窗口有一個理智的幾何體之前打開它,打開對話框將無法正常工作。

一個安全的選擇是使用onWidthChanged信號

main.qml

import QtQuick 2.2 
import QtQuick.Controls 1.0 

ApplicationWindow 
{ 
    id: appWindow 

    width: 480 
    height: 640 
    visible: true 


    StackView 
    { 
     id: stackView 
     anchors.fill: parent 
     // Implements back key navigation 
     focus: true 

     initialItem: Item 
     { 
      property bool firstTime: true 
      width: parent.width 
      height: parent.height 
      // ... 
      // width may be called multiple times 
      onWidthChanged: if (firstTime) {firstTime = true; dialog.open()} 
     } 
    } 

    MyDialog {id: dialog } 
} 
1

請參考官方文檔大約Dialog QML Type,那裏你可以找到未來:

注:不要試圖對話框的寬度或高度綁定其內容的寬度或高度爲 ,因爲Dialog已經嘗試將內容大小設爲 。如果您的目標是更改或消除邊距,則必須重寫contentItem。如果您的目標僅僅是顯示 一個窗口(無論是否爲模態),並且您的平臺支持該窗口,則更容易使用Window代替 。

因此,在你的情況下,它會更好地設置你的內部元素的隱式寬度。另一個快速解決方案是添加(例如)給定寬度的Rectangle元素作爲對話框的一個內部根元素。其餘的元素,你可以放在這裏Rectangle

+0

當我啓動的對話框'onCompleted'(查看更新的OP)纔會出現的問題。 Qt示例自己建議將'width'設置爲'parent.width',見 http://doc.qt.io/qt-5/qtquickdialogs-systemdialogs-customdialogs-qml.html – marmistrz

+1

首先,你是對的 - 它是原創例子中有趣的一點。其次,這是一個QML - >海事組織,從來不能確定100%。這裏是從文檔引用(組件)[http://doc.qt.io/qt-5/qml-qtqml-component.html]: >相應的處理程序是'onCompleted'。它可以在任何對象上聲明。運行'onCompleted'處理程序的順序是** undefined **。 只是一個測試筆記 - 嘗試觸發'StackedView'深度''的'dialog.open()'更改。 – troyane

+1

是的,情況就是這樣。我發佈了一個解決方案。使用'Stack.status'附加屬性比使用'depth'效率更高。如果你有更好的主意,請發佈。 – marmistrz

1

我張貼另一個答案,因爲它是另一種方法。我記得我是如何在一些舊項目上實現它的。 AFAIK,現在這是最好的方法。 如果有人給出更好的解決方案,我會很高興。

您需要添加一箇中間元素,如Timer。該定時器(tm,代碼如下)必須有較小的間隔(如30ms),並且需要在您所需的事件上啓動 - Component.onCompleted。把你的行動放在這個計時器的onTriggered

這裏是代碼:

ApplicationWindow { 
    title: qsTr("Hello World") 
    width: 640 
    height: 480 
    visible: true 

    Timer { 
     id: tm 
     interval: 30 
     onTriggered: dialog.open() 
    } 

    StackView { 
     id: stackView 
     anchors.fill: parent 
     // Implements back key navigation 
     focus: true 
     initialItem: Item { 
      width: parent.width 
      height: parent.heonTriggeredight 
      Button { onClicked: dialog.open() } 
      Component.onCompleted: tm.start() 
     } 
    } 

    MyDialog { id: dialog } 
}