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

PyQt6:主窗口最小化时创建极简控制栏的实现问题

PyQt6 实现主窗口最小化时的极简控制栏

要实现主窗口最小化时显示无标题栏的极简控制栏,核心是给控制窗口设置无框标志,同时监听主窗口的状态变化来控制控制栏的显示/隐藏。

完整代码示例

from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, 
                             QHBoxLayout, QPushButton)
from PyQt6.QtCore import Qt, QEvent

class MiniControlBar(QWidget):
    def __init__(self, main_window):
        super().__init__()
        self.main_window = main_window
        # 设置无框窗口,彻底移除标题栏和边框
        self.setWindowFlags(Qt.WindowType.FramelessWindowHint | 
                           Qt.WindowType.WindowStaysOnTopHint)
        # 布局与控制按钮
        layout = QHBoxLayout(self)
        layout.setContentsMargins(0,0,0,0)
        
        # 恢复主窗口按钮
        self.btn_restore = QPushButton("恢复")
        self.btn_restore.clicked.connect(self.restore_main_window)
        layout.addWidget(self.btn_restore)
        
        # 关闭应用按钮
        self.btn_close = QPushButton("关闭")
        self.btn_close.clicked.connect(self.close_main_window)
        layout.addWidget(self.btn_close)
        
        # 固定控制栏大小并定位到屏幕右下角
        self.resize(150, 30)
        screen_geo = QApplication.primaryScreen().geometry()
        self.move(screen_geo.width() - self.width(), 
                  screen_geo.height() - self.height())

    def restore_main_window(self):
        self.main_window.showNormal()
        self.hide()

    def close_main_window(self):
        self.main_window.close()
        self.close()

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("主应用窗口")
        self.resize(800, 600)
        # 初始化极简控制栏
        self.mini_bar = MiniControlBar(self)

    def changeEvent(self, event):
        if event.type() == QEvent.WindowStateChange:
            # 监听主窗口最小化状态
            if self.windowState() & Qt.WindowState.WindowMinimized:
                self.mini_bar.show()
                self.hide()  # 可选:隐藏主窗口,仅保留控制栏
            elif self.windowState() == Qt.WindowState.WindowNoState:
                self.mini_bar.hide()
        super().changeEvent(event)

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()

关键说明

  • 移除标题栏:通过Qt.WindowType.FramelessWindowHint标志直接去掉窗口的标题栏和边框,搭配WindowStaysOnTopHint可让控制栏始终显示在所有窗口上层。
  • 状态监听:重写主窗口的changeEvent方法,捕获窗口状态变化事件,根据主窗口的最小化/恢复状态自动切换控制栏的显示与隐藏。
  • 交互逻辑:控制栏的按钮直接关联主窗口的恢复、关闭操作,实现极简的控制功能。

内容的提问来源于stack exchange,提问作者Yazeed Hamdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:10:51