PyQt custom titlebar window (resizable, movable, minimize/maximize/close)
MIT License
PyQt custom titlebar window(resizable, movable, minimize/maximize/close).
User can set modernized and customized frame surrounding the widget you made.
You can set the title bar separately or set the menu bar as title bar.
Basic buttons like min/max/close are automatically set by user's OS.
You can set your customized buttons(e.g. min/max/close).
You can drag title bar or menu bar on widget to move the window, double-click it to show maximize/normal.
This also makes the application's font look much better by setting the font family to 'Arial'(which looks modern and commonly used), antialiasing the font.
The range of font size is set to 9~12 which is not too big, not too small.
If you want to set custom titlebar easily than use pyqt-custom-titlebar-setter.
If you want to use this in various ways than use this directly. see the example below.
PyQt5 >= 5.15 - This package is using startSystemMove, startSystemResize which were both introduced in Qt 5.15.
python -m pip install pyqt-custom-titlebar-window
FramelessWindow
setWindowTitle
. It also catches the windowTitleChanged
signal of your inner widget.CustomTitlebarWindow(CustomizedWidgetByUser())
- Constructor.setTopTitleBar(self, title: str = '', icon_filename: str = '', font: QFont = QFont('Arial', 14), align=Qt.AlignCenter, bottom_separator=False)
to set title bar on the top of the window.setButtons(btnWidget=None, align=Qt.AlignRight)
to add buttons(e.g. min/max/close) on the top right/left corner of title/menu bar. If btnWidget
is set to None, buttons' style are automatically set to your platform/OS friendly style. Basically you can give btnWidget
to your customized buttons(pyqt-titlebar-buttons-widget). I will explain it better. Sorry for weak explanation.setButtonHint(hint)
to set hints of buttons. There are three options available(close, min/close, min/max/close). Default value is min/max/close.setMenuAsTitleBar(self, title: str = '', icon_filename: str = '', font: QFont = QFont('Arial', 9))
to set the icon and title not only on the left side of menu bar, but also set it as window icon and title.Note: using this function, macOS
button will be positioned to right which is unorthodox.
QMenuBar
's background color or inner QWidget
's color if inner widget is not QMainWindow
.getCornerWidget()
to get corner widget of QMenuBar
easilygetInnerWidget()
to get inner widget easilyfrom PyQt5.QtWidgets import QApplication
from pyqt_custom_titlebar_window import CustomTitlebarWindow
from pyqt_dark_calculator import Calculator
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
customTitlebarWindow = CustomTitlebarWindow(Calculator())
customTitlebarWindow.setMenuAsTitleBar(icon_filename='calculator.svg')
# customTitlebarWindow.setButtonHint(hint=['close'])
customTitlebarWindow.setButtons()
customTitlebarWindow.show()
app.exec_()
In the code sample, pyqt-dark-calculator is being used as inner widget.
Here's another example with pyqt-dark-notepad.
As you see, existing corner widget doesn't matter.
from PyQt5.QtWidgets import QApplication
from pyqt_custom_titlebar_window import CustomTitlebarWindow
from pyqt_dark_notepad import DarkNotepad
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = DarkNotepad()
customTitlebarWindow = CustomTitlebarWindow(window)
customTitlebarWindow.setTopTitleBar(icon_filename='dark-notepad.svg')
# customTitlebarWindow.setButtonHint(['close'])
customTitlebarWindow.setButtons()
customTitlebarWindow.show()
app.exec_()