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
相关产品推荐
相关产品推荐

