2017-10-30 44 views
0

가 현재 나는 다음과 같은 방법으로 윈도우 열리는 있습니다개폐 추가 창 (QML)

property variant win 
Button { 
    id: testButton 
    MouseArea { 
     onClicked: { 
      var component = Qt.createComponent("test.qml"); 
      win = component.createObject(testButton); 
      win.show(); 
     } 
    } 
} 
  1. 가이 같은 창을 만들려면 확인인가를하거나 할 수있는 더 좋은 방법이 (C++이 아닌 QML에서)?

  2. "x"버튼을 클릭하기 만하면이 추가 창을 닫으면 다른 이벤트 (예 : 버튼의 색상 변경)에 연결하고 싶습니다. 그것을하는 방법?

감사합니다.

+0

부작용 : 데이터 유형 'variant'는 더 이상 사용되지 않습니다. 대신에'var'을 사용하십시오. 'Window'를 채우는 대신'property Window win'을 대신 사용하십시오. 참조 : http://doc.qt.io/qt-5/qml-variant.html – derM

답변

2

더 선언적으로 사용하는 것이 일반적으로 더 좋습니다. 버튼 하나로 하나의 창만 열리려면 Loader을 사용하는 것이 좋습니다.
하나의 변수에 저장하면 원하는대로 생각하고 버튼을 여러 번 클릭하면 인스턴스에 액세스 할 수 없게됩니다. 동일한 Button으로 생성 된 더 많은 양의 Windows이 필요한 경우 ListModelInstantiator을 사용하여 인스턴스를 만들 수 있습니다. Loader

이 다음과 같습니다이 코드에서

Button { 
    id: ldbutton 
    onClicked: winld.active = true 
    Rectangle { 
     id: ldindic 
     anchors { 
      left: parent.left 
      top: parent.top 
      bottom: parent.bottom 
     } 
     width: height 
     color: winld.active ? 'green' : 'red' 
    } 

    Loader { 
     id: winld 
     active: false 
     sourceComponent: Window { 
      width: 100 
      height: 100 
      color: 'green' 
      visible: true 
      onClosing: winld.active = false 
     } 
    } 
} 

이미도 두 번째 질문에 대한 대답입니다 : 당신이 closing라고 찾고있는 신호는 - 어떤 사상을 할에 연결 필수적이다.

Loader의 경우 창을 언로드해야하므로 나중에 다시로드 할 수 있습니다. Instantiator으로 창을 만든 경우 InstantiatorListModel에서 해당 색인을 제거해야합니다.

이는 다음과 같습니다 당신이 연결할 수있는 코드에서

Button { 
    id: rpbutton 
    onClicked: rpmodel.append({}) 
    text: 'Open Windows ' + rpmodel.count 

    ListModel { 
     id: rpmodel 
    } 

    Instantiator { // from QtQml 2.0 
     model: rpmodel 
     delegate: Window { 
      width: 100 
      height: 100 
      color: 'blue' 
      visible: true 
      onClosing: rpmodel.remove(index) 
     } 
    } 
} 

, 중 재산 win, 또는 그렇게처럼 JS onClicked을 변경하여 연결하는 Connection -object를 사용하여 :

onClicked: { 
    var component = Qt.createComponent("test.qml"); 
    win = component.createObject(testButton); 
    win.closing.connect(function() { console.log('do something') }) 
    win.show(); 
} 
+0

어떤 이유인지'onclosing'이'Qt.Quick.Window 2.2'를 사용하여'invalid property'로 표시되었습니다. 나는 다른 사람들이 같은 문제를보고하는 것을 보았지만 해결책은 없다. 이 문제를 해결하는 방법을 알고 있습니까? 감사. – Valeria

+0

경고가 발생 했습니까? 또는 QtCreator 만 불만입니까? 그렇다면 새로운 버전이 나올 때마다 다시 나타나는 버그 때문입니다 :-)하지만 안전하게 무시할 수 있다고 가정합니다. – derM