Tôi đang làm việc trên ứng dụng máy tính để bàn Qt (5.3) (lõi C++ với một QML ui) có cửa sổ chính là ApplicationWindow
và tại một số điểm khởi chạy Dialog
s. Vì có sự khác biệt trong việc sử dụng phương thức đối thoại giữa Windows và Mac OS X (ví dụ: Hộp thoại về hiếm khi trên Mac OS X nhưng hầu như luôn luôn là phương thức trên Windows) và cũng như cách trình bày nội dung của một số hộp thoại đã thay đổi thiết kế để cho phép thực hiện các phiên bản nền tảng cụ thể của các hộp thoại.Làm thế nào để thay đổi cha mẹ tạm thời của một Hộp thoại/Cửa sổ QML?
Đối vì vậy tôi đã tạo ra DialogLoader sau:
Loader {
id: dialogFactory
property string dialogName
function platformFolder() {
if (Qt.platform.os === "osx")
return "osx"
return "win"
}
onDialogNameChanged: { source = platformFolder() + "/" + dialogName + ".qml" }
onStatusChanged: {
if (dialogFactory.status === Loader.Error)
console.log("DialogFactory: failed to load file: " + source);
else if (dialogFactory.status === Loader.Ready)
console.log("DialogFactory: file \"" + source + "\" loaded")
}
}
Mà tôi sử dụng như sau:
ApplicationWindow {
// …
property alias aboutDialog: aboutDialogLoader.item
// …
DialogLoader { id: aboutDialogLoader; dialogName: "AboutDialog" }
// …
Action { text: qsTr("About..."); onTriggered: aboutDialog.show() }
// …
}
Cách tiếp cận đó đang làm việc tốt và nó phù hợp với nhu cầu của tôi ngoại trừ một điều: Các hộp thoại phương thức trên Windows không hoạt động giống như khi chúng tôi khai báo chúng trực tiếp trên ApplicationWindow
. Nếu ứng dụng mất tập trung khi một cửa sổ phương thức được mở và tiêu điểm được cấp lại, cửa sổ phương thức xuất hiện phía sau cửa sổ chính khiến ứng dụng không hoạt động.
Sau một số nghiên cứu, tôi đã nhận ra rằng nguyên nhân của vấn đề là với cách tiếp cận bộ nạp ApplicationWindow
không hoạt động như phụ huynh tạm thời của Dialog
.
Tôi đã tìm thấy một công việc xung quanh cho điều này bằng tay đưa Dialog để trước khi điều đó xảy ra:
MainWindow {
// ...
onActiveChanged: {
if (Qt.platform.os === "windows") {
if (active) {
// ...
if (aboutDialog.visible) {
aboutDialog.requestActivate()
}
// ...
}
}
}
// ...
}
nhưng tôi nghĩ rằng nó sẽ được tốt hơn để tránh như vậy công việc ở quanh, nếu có thể. Sau khi đào sâu vào tài liệu Qt mà không có bất kỳ may mắn nào, tôi quyết định đăng câu hỏi này, có thể được tiếp tục như sau: Có thể thay đổi cha mẹ tạm thời của Cửa sổ QML không? Nếu vậy, xin vui lòng bạn sẽ chỉ ra làm thế nào?
Đề xuất về một cách tiếp cận khác có thể tránh được các nội dung khẩn cấp được hoan nghênh.
Điều này có vẻ lạ: không phải hộp thoại sẽ là gốc và người quản lý cửa sổ gốc có chịu trách nhiệm làm cho nó xếp chồng lên nhau không? Ngoài ra, không đủ thông tin: hộp thoại của bạn là Hộp thoại QML hay Cửa sổ QML có gắn cờ là Qt.Dialog chưa? (Tôi có các vấn đề tương tự bằng cách sử dụng Hộp thoại QML nhúng trên Linux: nó không tập trung vào cha mẹ.) Có thể Hộp thoại QML bị hỏng. – bootchk