class ModernWindow(QWidget): """ Modern window. Args: w (QWidget): Main widget. parent (QWidget, optional): Parent widget. """ def __init__(self, w, parent=None): QWidget.__init__(self, parent) self._w = w self.setupUi() contentLayout = QHBoxLayout() contentLayout.setContentsMargins(0, 0, 0, 0) contentLayout.addWidget(w) self.windowContent.setLayout(contentLayout) self.setWindowTitle(w.windowTitle()) self.setGeometry(w.geometry()) # Adding attribute to clean up the parent window when the child is closed self._w.setAttribute(Qt.WA_DeleteOnClose, True) self._w.destroyed.connect(self.__child_was_closed) def setupUi(self): # create title bar, content self.vboxWindow = QVBoxLayout(self) self.vboxWindow.setContentsMargins(0, 0, 0, 0) self.windowFrame = QWidget(self) self.windowFrame.setObjectName('windowFrame') self.vboxFrame = QVBoxLayout(self.windowFrame) self.vboxFrame.setContentsMargins(0, 0, 0, 0) self.titleBar = WindowDragger(self, self.windowFrame) self.titleBar.setObjectName('titleBar') self.titleBar.setSizePolicy( QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)) self.hboxTitle = QHBoxLayout(self.titleBar) self.hboxTitle.setContentsMargins(0, 0, 0, 0) self.hboxTitle.setSpacing(0) self.lblTitle = QLabel('Title') self.lblTitle.setObjectName('lblTitle') self.lblTitle.setAlignment(Qt.AlignCenter) spButtons = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.btnMinimize = QToolButton(self.titleBar) self.btnMinimize.setObjectName('btnMinimize') self.btnMinimize.setSizePolicy(spButtons) self.btnRestore = QToolButton(self.titleBar) self.btnRestore.setObjectName('btnRestore') self.btnRestore.setSizePolicy(spButtons) self.btnRestore.setVisible(False) self.btnMaximize = QToolButton(self.titleBar) self.btnMaximize.setObjectName('btnMaximize') self.btnMaximize.setSizePolicy(spButtons) self.btnClose = QToolButton(self.titleBar) self.btnClose.setObjectName('btnClose') self.btnClose.setSizePolicy(spButtons) self.vboxFrame.addWidget(self.titleBar) self.windowContent = QWidget(self.windowFrame) self.vboxFrame.addWidget(self.windowContent) self.vboxWindow.addWidget(self.windowFrame) if PLATFORM == "Darwin": self.hboxTitle.addWidget(self.btnClose) self.hboxTitle.addWidget(self.btnMinimize) self.hboxTitle.addWidget(self.btnRestore) self.hboxTitle.addWidget(self.btnMaximize) self.hboxTitle.addWidget(self.lblTitle) else: self.hboxTitle.addWidget(self.lblTitle) self.hboxTitle.addWidget(self.btnMinimize) self.hboxTitle.addWidget(self.btnRestore) self.hboxTitle.addWidget(self.btnMaximize) self.hboxTitle.addWidget(self.btnClose) # set window flags self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint) if QT_VERSION >= (5, ): self.setAttribute(Qt.WA_TranslucentBackground) # set stylesheet with open(_FL_STYLESHEET) as stylesheet: self.setStyleSheet(stylesheet.read()) # automatically connect slots QMetaObject.connectSlotsByName(self) def __child_was_closed(self): self._w = None # The child was deleted, remove the reference to it and close the parent window self.close() def closeEvent(self, event): if not self._w: event.accept() else: self._w.close() event.setAccepted(self._w.isHidden()) def setWindowTitle(self, title): """ Set window title. Args: title (str): Title. """ super(ModernWindow, self).setWindowTitle(title) self.lblTitle.setText(title) @Slot() def on_btnMinimize_clicked(self): self.setWindowState(Qt.WindowMinimized) @Slot() def on_btnRestore_clicked(self): self.btnRestore.setVisible(False) self.btnMaximize.setVisible(True) self.setWindowState(Qt.WindowNoState) @Slot() def on_btnMaximize_clicked(self): self.btnRestore.setVisible(True) self.btnMaximize.setVisible(False) self.setWindowState(Qt.WindowMaximized) @Slot() def on_btnClose_clicked(self): self.close() @Slot() def on_titleBar_doubleClicked(self): if self.btnMaximize.isVisible(): self.on_btnMaximize_clicked() else: self.on_btnRestore_clicked()
class ModernWindow(QWidget): def __init__(self, window, app_manager, parent=None): QWidget.__init__(self, parent) self.app = app_manager self._window = window self.vboxWindow = QVBoxLayout(self) self.windowFrame = QWidget(self) self.vboxFrame = QVBoxLayout(self.windowFrame) self.titleBar = WindowDragger(self, self.windowFrame) self.hboxTitle = QHBoxLayout(self.titleBar) self.lblTitle = QLabel('Title') self.btnMinimize = QToolButton(self.titleBar) self.btnRestore = QToolButton(self.titleBar) self.btnMaximize = QToolButton(self.titleBar) self.btnClose = QToolButton(self.titleBar) self.windowContent = QWidget(self.windowFrame) self.setup_ui() content_layout = QHBoxLayout() content_layout.setContentsMargins(0, 0, 0, 0) content_layout.addWidget(window) self.windowContent.setLayout(content_layout) self.setWindowTitle(window.windowTitle()) self.setGeometry(window.geometry()) self.installEventFilter(self) # Adding attribute to clean up the parent window when the child is closed self._window.setAttribute(Qt.WA_DeleteOnClose, True) self._window.destroyed.connect(self.__child_was_closed) def setup_ui(self): # create title bar, content self.vboxWindow.setContentsMargins(0, 0, 0, 0) self.windowFrame.setObjectName('windowFrame') self.vboxFrame.setContentsMargins(0, 0, 0, 0) self.titleBar.setObjectName('titleBar') self.titleBar.setSizePolicy( QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)) self.hboxTitle.setContentsMargins(0, 0, 0, 0) self.hboxTitle.setSpacing(0) self.lblTitle.setObjectName('lblTitle') self.lblTitle.setAlignment(Qt.AlignCenter) self.hboxTitle.addWidget(self.lblTitle) sp_buttons = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.btnMinimize.setObjectName('btnMinimize') self.btnMinimize.setSizePolicy(sp_buttons) self.hboxTitle.addWidget(self.btnMinimize) self.btnRestore.setObjectName('btnRestore') self.btnRestore.setSizePolicy(sp_buttons) self.btnRestore.setVisible(False) self.hboxTitle.addWidget(self.btnRestore) self.btnMaximize.setObjectName('btnMaximize') self.btnMaximize.setSizePolicy(sp_buttons) self.hboxTitle.addWidget(self.btnMaximize) self.btnClose.setObjectName('btnClose') self.btnClose.setSizePolicy(sp_buttons) self.hboxTitle.addWidget(self.btnClose) self.vboxFrame.addWidget(self.titleBar) self.vboxFrame.addWidget(self.windowContent) self.vboxWindow.addWidget(self.windowFrame) # set window flags self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint) if self._window.app.qt_version >= (5, ): self.setAttribute(Qt.WA_TranslucentBackground) # set stylesheet stylesheet = self.app.ui.get_stylesheet('frameless.qss') self.setStyleSheet(stylesheet) # automatically connect slots QMetaObject.connectSlotsByName(self) def __child_was_closed(self): self._window = None # The child was deleted, remove the reference to it and close the parent window self.close() def eventFilter(self, source, event): if event.type() == QEvent.Close: if not self._window: return True return self._window.close() return QWidget.eventFilter(self, source, event) def setWindowTitle(self, title): super(ModernWindow, self).setWindowTitle(title) self.lblTitle.setText(title) @Slot() def on_btnMinimize_clicked(self): self.setWindowState(Qt.WindowMinimized) @Slot() def on_btnRestore_clicked(self): self.btnRestore.setVisible(False) self.btnMaximize.setVisible(True) self.setWindowState(Qt.WindowNoState) @Slot() def on_btnMaximize_clicked(self): self.btnRestore.setVisible(True) self.btnMaximize.setVisible(False) self.setWindowState(Qt.WindowMaximized) @Slot() def on_btnClose_clicked(self): self.close() @Slot() def on_titleBar_doubleClicked(self): if self.btnMaximize.isVisible(): self.on_btnMaximize_clicked() else: self.on_btnRestore_clicked()
class ModernWindow(QWidget): """ Modern window. Args: w (QWidget): Main widget. parent (QWidget, optional): Parent widget. """ windowCollapse = Signal() windowUncollapse = Signal() minimized = Signal() unMinimized = Signal() def __init__(self, w, parent=None): super().__init__(parent) self.setupUi() self.setupEvents(w) contentLayout = QHBoxLayout() contentLayout.setContentsMargins(0, 0, 0, 0) contentLayout.addWidget(w) self.windowContent.setLayout(contentLayout) self.setWindowTitle(w.windowTitle()) self.setGeometry(w.geometry()) def setupUi(self): # create title bar, content self.vboxWindow = QVBoxLayout(self) self.vboxWindow.setContentsMargins(0, 0, 0, 0) self.windowFrame = QWidget(self) self.windowFrame.setObjectName('windowFrame') self.vboxFrame = QVBoxLayout(self.windowFrame) self.vboxFrame.setContentsMargins(0, 0, 0, 0) self.titleBar = WindowDragger(self, self.windowFrame) self.titleBar.setObjectName('titleBar') self.titleBar.setSizePolicy( QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)) self.hboxTitle = QHBoxLayout(self.titleBar) self.hboxTitle.setContentsMargins(0, 0, 0, 0) self.hboxTitle.setSpacing(0) self.lblTitle = QLabel('Title') self.lblTitle.setObjectName('lblTitle') self.lblTitle.setAlignment(Qt.AlignCenter) self.hboxTitle.addWidget(self.lblTitle) spButtons = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.dragArea = QWidget(self.titleBar) self.dragArea.setObjectName('dragArea') self.dragAreaLayout = QHBoxLayout(self.dragArea) self.spacer = QSpacerItem(20, 0, QSizePolicy.Expanding, QSizePolicy.Minimum) self.dragArea.setVisible(False) self.dragAreaLayout.addItem(self.spacer) self.hboxTitle.addWidget(self.dragArea) self.btnCollapse = QToolButton(self.titleBar) self.btnCollapse.setObjectName('btnCollapse') self.btnCollapse.setSizePolicy(spButtons) self.btnCollapse.setVisible(False) self.hboxTitle.addWidget(self.btnCollapse) self.btnUncollapse = QToolButton(self.titleBar) self.btnUncollapse.setObjectName('btnUncollapse') self.btnUncollapse.setSizePolicy(spButtons) self.btnUncollapse.setVisible(False) self.hboxTitle.addWidget(self.btnUncollapse) self.btnMinimize = QToolButton(self.titleBar) self.btnMinimize.setObjectName('btnMinimize') self.btnMinimize.setSizePolicy(spButtons) self.hboxTitle.addWidget(self.btnMinimize) self.btnRestore = QToolButton(self.titleBar) self.btnRestore.setObjectName('btnRestore') self.btnRestore.setSizePolicy(spButtons) self.btnRestore.setVisible(False) self.hboxTitle.addWidget(self.btnRestore) self.btnMaximize = QToolButton(self.titleBar) self.btnMaximize.setObjectName('btnMaximize') self.btnMaximize.setSizePolicy(spButtons) self.hboxTitle.addWidget(self.btnMaximize) self.btnClose = QToolButton(self.titleBar) self.btnClose.setObjectName('btnClose') self.btnClose.setSizePolicy(spButtons) self.hboxTitle.addWidget(self.btnClose) self.vboxFrame.addWidget(self.titleBar) self.windowContent = QWidget(self.windowFrame) self.vboxFrame.addWidget(self.windowContent) self.vboxWindow.addWidget(self.windowFrame) # set window flags self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint) if QT_VERSION >= (5, ): self.setAttribute(Qt.WA_TranslucentBackground) self.updateFrameSheet() # automatically connect slots QMetaObject.connectSlotsByName(self) def updateFrameSheet(self): if globals.applied_style == 'light': f = QFile(':/frameless-light.qss') elif globals.applied_style == 'dark': f = QFile(':/frameless-dark.qss') else: raise RuntimeError( 'Set the app style theme before instantiating ModernWindow') f.open(QIODevice.ReadOnly | QIODevice.Text) text = QTextStream(f) text.setCodec('UTF-8') text = text.readAll() self.setStyleSheet(text) f.close() def changeEvent(self, event): if event.type() == QEvent.PaletteChange: self.updateFrameSheet() elif event.type() == QEvent.WindowStateChange: if self.windowState() == Qt.WindowMinimized: self.minimized.emit() elif self.windowState() == Qt.WindowNoState: self.unMinimized.emit() def setupEvents(self, w): self.setWindowIcon(w.windowIcon()) w.close = self.close self.closeEvent = w.closeEvent def setWindowTitle(self, title): """ Set window title. Args: title (str): Title. """ super(ModernWindow, self).setWindowTitle(title) self.lblTitle.setText(title) @Slot() def on_btnMinimize_clicked(self): self.setWindowState(Qt.WindowMinimized) @Slot() def on_btnRestore_clicked(self): self.btnRestore.setVisible(False) self.btnMaximize.setVisible(True) self.setWindowState(Qt.WindowNoState) @Slot() def on_btnMaximize_clicked(self): self.btnRestore.setVisible(True) self.btnMaximize.setVisible(False) self.setWindowState(Qt.WindowMaximized) @Slot() def on_btnClose_clicked(self): self.close() @Slot() def on_titleBar_doubleClicked(self): if self.btnMaximize.isVisible(): self.on_btnMaximize_clicked() else: self.on_btnRestore_clicked() @Slot() def on_btnCollapse_clicked(self): self.windowCollapse.emit() @Slot() def on_btnUncollapse_clicked(self): self.windowUncollapse.emit()
class ModernWindow(QWidget): """ Modern window. Args: w (QWidget): Main widget. parent (QWidget, optional): Parent widget. """ def __init__(self, w, parent=None): QWidget.__init__(self, parent) self._w = w self.setupUi() contentLayout = QHBoxLayout() contentLayout.setContentsMargins(0, 0, 0, 0) contentLayout.addWidget(w) self.windowContent.setLayout(contentLayout) self.setWindowTitle(w.windowTitle()) self.setGeometry(w.geometry()) self.installEventFilter(self) def setupUi(self): # create title bar, content self.vboxWindow = QVBoxLayout(self) self.vboxWindow.setContentsMargins(0, 0, 0, 0) self.windowFrame = QWidget(self) self.windowFrame.setObjectName('windowFrame') self.vboxFrame = QVBoxLayout(self.windowFrame) self.vboxFrame.setContentsMargins(0, 0, 0, 0) self.titleBar = WindowDragger(self, self.windowFrame) self.titleBar.setObjectName('titleBar') self.titleBar.setSizePolicy( QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)) self.hboxTitle = QHBoxLayout(self.titleBar) self.hboxTitle.setContentsMargins(0, 0, 0, 0) self.hboxTitle.setSpacing(0) self.lblTitle = QLabel('Title') self.lblTitle.setObjectName('lblTitle') self.lblTitle.setAlignment(Qt.AlignCenter) self.hboxTitle.addWidget(self.lblTitle) spButtons = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.btnMinimize = QToolButton(self.titleBar) self.btnMinimize.setObjectName('btnMinimize') self.btnMinimize.setSizePolicy(spButtons) self.hboxTitle.addWidget(self.btnMinimize) self.btnRestore = QToolButton(self.titleBar) self.btnRestore.setObjectName('btnRestore') self.btnRestore.setSizePolicy(spButtons) self.btnRestore.setVisible(False) self.hboxTitle.addWidget(self.btnRestore) self.btnMaximize = QToolButton(self.titleBar) self.btnMaximize.setObjectName('btnMaximize') self.btnMaximize.setSizePolicy(spButtons) self.hboxTitle.addWidget(self.btnMaximize) self.btnClose = QToolButton(self.titleBar) self.btnClose.setObjectName('btnClose') self.btnClose.setSizePolicy(spButtons) self.hboxTitle.addWidget(self.btnClose) self.vboxFrame.addWidget(self.titleBar) self.windowContent = QWidget(self.windowFrame) self.vboxFrame.addWidget(self.windowContent) self.vboxWindow.addWidget(self.windowFrame) # set window flags self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint) if QT_VERSION >= (5, ): self.setAttribute(Qt.WA_TranslucentBackground) # set stylesheet with open(_FL_STYLESHEET) as stylesheet: self.setStyleSheet(stylesheet.read()) # automatically connect slots QMetaObject.connectSlotsByName(self) def eventFilter(self, source, event): if event.type() == QEvent.Close: return self._w.close() return QWidget.eventFilter(self, source, event) def setWindowTitle(self, title): """ Set window title. Args: title (str): Title. """ self.lblTitle.setText(title) @Slot() def on_btnMinimize_clicked(self): self.setWindowState(Qt.WindowMinimized) @Slot() def on_btnRestore_clicked(self): self.btnRestore.setVisible(False) self.btnMaximize.setVisible(True) self.setWindowState(Qt.WindowNoState) @Slot() def on_btnMaximize_clicked(self): self.btnRestore.setVisible(True) self.btnMaximize.setVisible(False) self.setWindowState(Qt.WindowMaximized) @Slot() def on_btnClose_clicked(self): self.close() @Slot() def on_titleBar_doubleClicked(self): if self.btnMaximize.isVisible(): self.on_btnMaximize_clicked() else: self.on_btnRestore_clicked()