You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:20:06