Plasma 6.0 Wayland下如何让无模式子窗口始终置于主窗口上方(不遮挡其他应用)
解决Plasma 6.0 Wayland下无模式子窗口始终置顶主窗口的问题
核心方案
在Wayland环境中,Qt的窗口管理逻辑与X11差异较大,单纯依赖Qt.Tool或父窗口关联无法实现需求。需使用**Qt.WindowStaysOnTopOfParentHint**专属标志,搭配正确的窗口类型组合,同时规避全局置顶的Qt.WindowStaysOnTopHint。
另外,QDialog默认带有模态相关行为,改用QWidget作为子窗口容器,能更精准地控制无模式交互与置顶逻辑。
修改后的可运行代码
from PySide6.QtCore import Qt from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton class ChildWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) # 组合窗口标志:无模式窗口 + 仅置顶父窗口 + 保留标准窗口装饰 self.setWindowFlags( Qt.WindowType.Window | Qt.WindowType.WindowStaysOnTopOfParentHint | Qt.WindowType.WindowTitleHint | Qt.WindowType.WindowSystemMenuHint ) self.setWindowTitle("Child") self.setGeometry(0, 0, 400, 200) class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Main") self.setGeometry(100, 100, 500, 300) self.but = QPushButton("Open", self) self.but.clicked.connect(self.open_child) self.child_window = ChildWindow(self) self.child_window.show() def open_child(self): self.child_window.show() self.child_window.raise_() # 确保Wayland环境下子窗口激活并置顶 if __name__ == "__main__": app = QApplication() window = MainWindow() window.show() app.exec()
关键细节说明
Qt.WindowStaysOnTopOfParentHint:该标志是Qt专为子窗口设计的局部置顶属性,仅让子窗口停留在父窗口上方,不会跨越到其他应用层级,完全匹配需求。- 窗口类型组合:以
Qt.Window为基础类型,搭配标题栏、系统菜单标志,保证子窗口的交互完整性,避免出现无装饰的异常窗口。 raise_()方法:在显示子窗口时调用,确保Wayland合成器正确识别子窗口的激活状态,避免因协议特性导致的置顶失效。
Dolphin的配置窗口正是采用了类似的窗口标志与父子关联逻辑,因此能在Plasma 6.0 Wayland下实现预期效果。
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

