Как сделать немодальное диалоговое окно всегда сверху?
Я использую экземпляр Dialog {} в моем приложении для отображения небольшого окна контроллера, с которым пользователь может взаимодействовать, чтобы повлиять на функции в главном окне (вид пульта дистанционного управления). Я могу сделать этот диалог модальным (modality: Qt.WindowModal или modality: Qt.ApplicationModal) или я могу сделать его немодальным с modality: Qt.NonModal.
моя проблема в том, что мне нужно сделать его немодальным, но всегда быть поверх главного окна. Если я использую Qt.NonModal Я все еще могу нажать на основную форму, но затем мой диалог идет за ней. Этот Dialog класс не кажется flags: собственность, поэтому я не могу просто установить его в Qt.WindowsStaysOnTopHint.
есть ли способ установить флаги диалога, подобного этому, исключительно со стороны QML? Или можно написать простой метод утилиты на c++, который я мог бы вызвать изComponent.onCompleted: и пройти в диалоговом окне, чтобы установить его флаги windows там?
Update: чтобы проиллюстрировать, о чем я говорю, вот мой диалог поверх моего основного окно:
вот мой диалог под моим главным окном:
Я хочу, чтобы мой диалог не проходил под моим главным окном, но я все равно хочу иметь возможность нажимать и взаимодействовать с моим главным окном. Другими словами, Я хочу, чтобы мой диалог был немодальным, но всегда сверху.
3 ответов
попробуйте использовать Window вместо Dialog таким образом, у вас будет доступ к flags собственность.
вы можете установить flags to Qt.WindowStaysOnTopHint чтобы ваше окно всегда поверх остальных. Вы можете найти список флагов здесь. (Не забудьте заменить :: by . в 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
}
}
}
результат :
хорошо, поэтому вы просто хотите создать диалог (или компонент, который выглядит как диалог) и просто хотите взаимодействовать с главным окном и диалоговое окно.
пожалуйста, попробуйте следующее:
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
}
}
}
обычно вы хотите использовать Dialog не только для создания нового окна, но и для его реализованной функциональности и интерфейса...
причина в том, что Dialog не наследует Window или ApplicationWindow очевидно: нет окна, пока его нет open(). Но как только он открыт, есть ApplicationWindow (от Наш QtQuick.Управления 1.4)
теперь, в документации мы находим это хорошее attatched свойство: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 который остается сверху, но не является модальным.


