我在我的应用程序中使用一个Dialog {}实例来显示一个小控制器窗口,用户可以与之交互以影响主窗口中的功能(某种程度上是一种远程控制)。我可以使这个对话模式(modality: Qt.WindowModal或modality: Qt.ApplicationModal)或我可以使它与modality: Qt.NonModal非模态.
我的问题是,我需要使它成为非模态,但总是在主窗口顶部。如果我使用Qt.NonModal,我仍然可以点击主表单,但是我的对话框在后面。Dialog类似乎没有flags:属性,所以我不能仅仅将它设置为Qt.WindowsStaysOnTopHint。
是否有任何方法可以完全从QML一侧设置这样的对话框标志?或者可以用c++编写一个简单的实用程序方法,我可以从对话框的Component.onCompleted:中调用该方法并传入对话框,在那里设置它的窗口标志?
更新:为了说明我在说什么,下面是我的主窗口顶部的对话框:

下面是我在主窗口下面的对话框:

我希望我的对话框不要像这样在我的主窗口下面,但我仍然希望能够点击并与我的主窗口进行交互。换句话说,我希望我的对话是非模态的,但总是在顶部。
发布于 2017-07-07 15:07:40
尝试使用Window而不是Dialog,这样您就可以访问flags属性。
您可以将flags设置为Qt.WindowStaysOnTopHint,使您的窗口始终位于其他窗口之上。您可以找到标志这里的列表。(别忘了用QML中的::替换. )
Main.qml:
import QtQuick 2.5
import QtQuick.Controls 2.0
import QtQuick.Dialogs 1.2
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button {
id: btn
width: 100 ; height : 40
text: "click me"
}
Text {
anchors.top : btn.bottom
text: "Button currently pressed"
visible: btn.pressed
}
DialogOnTop {
}
}DialogOnTop.qml:
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
Window {
id: myWindow
width: 200
height: 200
flags: Qt.Window | Qt.WindowSystemMenuHint
| Qt.WindowTitleHint | Qt.WindowMinimizeButtonHint
| Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint
visible: true
modality: Qt.NonModal // no need for this as it is the default value
Rectangle {
color: "lightskyblue"
anchors.fill: parent
Text {
text: "Hello !"
color: "navy"
anchors.centerIn: parent
}
}
}结果:

发布于 2017-07-12 22:10:12
通常您想要使用Dialog不仅仅是为了创建一个新窗口,而是为了实现它的功能和接口.
Dialog没有继承Window或ApplicationWindow的原因很明显:没有窗口,只要它不是open()。但是一旦打开,就会有一个ApplicationWindow (来自QtQuick.Controls 1.4)。
现在,在文档中,我们发现了一个很好的属性:ApplicationWindow,它对每个Item都是可用的,并且很方便地允许我们访问窗口。然后,我们只需要找到一种方法,在ApplicationWindow可用时设置正确的标志--例如,当我们得到信号visibleChanged时。
由于Dialog也不是Item,所以我们需要使用它的contentItem来访问这个附加属性。
当我们将所有这些放在一起时,结果可能如下所示:
NonModalDialogThatStaysOnTop.qml //我不擅长命名
import QtQuick 2.3
import QtQuick.Controls 1.4 // You need this, to have access to the `ApplicationWindow`-attatched property
import QtQuick.Dialogs 1.2
Dialog {
onVisibleChanged: {
if (visible) contentItem.ApplicationWindow.window.flags |= Qt.WindowStaysOnTopHint
}
modality: "NonModal"
}现在,您有您最喜欢的Dialog,保持在顶部,但不是模式。
发布于 2017-07-07 08:23:08
好的,您只需要创建一个Dialog (或者一个看起来像Dialog的组件),只想与主窗口和Dialog窗口交互。
请试用以下方法:
main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
ApplicationWindow {
id: rootWindow
visible: true
width: 640
height: 480
title: qsTr("Hello World")
color: "green"
Rectangle {
id: behind
anchors.fill: parent
color: Qt.rgba(0, 0, 0, 0.7)
visible: false
}
MouseArea {
enabled: behind.visible
anchors.fill: parent
onClicked: {
console.log("Root Window")
}
}
Button {
text: "Open Dialog"
onClicked: {
behind.visible = true;
var comp = Qt.createComponent("qrc:/MyDialog.qml");
// var comp = Qt.createComponent("qrc:/DialogQt.qml");
var obj1 = comp.createObject(rootWindow, {});
obj1.z = 2;
}
}
}MyDialog.qml
import QtQuick 2.7
Rectangle {
id: modalWindow
width: 200
height: 200
color: "red"
anchors.centerIn: parent
MouseArea {
anchors.fill: parent
onClicked: {
console.log("Modal Window")
}
}
}单击“打开对话框”按钮将创建并打开主窗口组件顶部的“模式”对话框。
当然,您必须调整"MyDialog.qml“文件以满足您自己的设计要求。
然而,使用它作为一个“真实的”对话框(对我来说)也是有效的,就像G.M已经在评论部分中指出的那样:
DialogQt.qml
Dialog {
visible: true
title: "Blue sky dialog"
modality : Qt.ApplicationModal
contentItem: Rectangle {
color: "lightskyblue"
anchors.fill: parent
Text {
text: "Hello blue sky!"
color: "navy"
anchors.centerIn: parent
}
}
}https://stackoverflow.com/questions/44951046
复制相似问题