PyQt frameless window to inherit a variety of frameless widget
Project description
pyqt-frameless-window
PyQt(+PySide) Frameless Window
Feature
-
Frameless
-
Using Windows API (for Windows OS effect - shadow, rounded, animation, etc.)
-
Supports PyQt5, PySide2, PySide6
-
User can make it enable/disable to move, resize
-
Supports QWidget, QDialog, QMainWindow
Note
I have no macOS and linux so i couldn't manage to support them as well.
Maybe i can use the virtual machine or something to do it.
There is no title bar for Windows! I will make it as soon as possible.
Requirements
-
PyQt5 - Use QtWinExtras to use Windows API feature in Qt (Qt6 doesn't support QtWinExtras anymore, sadly)
-
qtpy - To use PyQt5, PySide2(Qt version 5), PySide6(Qt version 6)
Setup
New version (using Windows API)
python -m pip install pyqt-frameless-window
Classic version
python -m pip install pyqt-frameless-window==0.0.61
Class Overview
-
FramelessWidget - frameless QWidget
-
FramelessDialog - frameless QDialog
-
FramelessMainWindow - frameless QMainWindow
Method Overview
For Windows & The Others
-
setResizable(f: bool)
- Set resizable/none-resizable -
isResizable() -> bool
- Check if window is resizable or not -
setPressToMove(f: bool)
- Set movable/non-movable -
isPressToMove() -> bool
- Check if window is movable or not
The Others
-
setMargin(margin: int)
- Set the margin which allows cursor to change its shape to resize form -
setFrameColor(color)
- Set the background color. color argument type can be both QColor and str. -
getFrameColor
-> QColor - Get the background color. -
setVerticalExpandedEnabled(f: bool)
- Make it able to expand vertically when double-clicking the top or bottom edges of the window.
Example
PyQt5 Code Sample
import sys
from pyqt_frameless_window import FramelessDialog
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QPushButton, \
QTextBrowser
class Window(FramelessDialog):
def __init__(self):
super().__init__()
self.__initUi()
def __initUi(self):
self.setWindowTitle('Basic Window Example')
self.__minBtn = QPushButton('Min')
self.__maxBtn = QPushButton('Max')
self.__maxBtn.setCheckable(True)
self.__fullScreenBtn = QPushButton('FullScreen')
self.__fullScreenBtn.setCheckable(True)
self.__closeBtn = QPushButton('Close')
self.__minBtn.clicked.connect(self.showMinimized)
self.__maxBtn.toggled.connect(self.__maximize)
self.__fullScreenBtn.toggled.connect(self.__fullScreen)
self.__closeBtn.clicked.connect(self.close)
lay = QHBoxLayout()
lay.addWidget(self.__fullScreenBtn)
lay.addWidget(self.__minBtn)
lay.addWidget(self.__maxBtn)
lay.addWidget(self.__closeBtn)
lay.setSpacing(0)
topWidget = QWidget()
topWidget.setLayout(lay)
lay = QVBoxLayout()
lay.addWidget(topWidget)
lay.addWidget(QTextBrowser())
self.setLayout(lay)
def __maximize(self, f):
if f:
self.showMaximized()
else:
self.showNormal()
def __fullScreen(self, f):
if f:
self.showFullScreen()
else:
self.showNormal()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
PySide6 Code Sample
import sys
# IMPORTANT!!!!!!!!!
# to prevent the "QWidget: Must construct a QApplication before a QWidget" error, you should put the code below
from PySide6.QtCore import Qt
from pyqt_frameless_window import FramelessDialog
from PySide6.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QPushButton, \
QTextBrowser
class Window(FramelessDialog):
def __init__(self):
super().__init__()
self.__initUi()
def __initUi(self):
self.setWindowTitle('Basic Window Example')
self.__minBtn = QPushButton('Min')
self.__maxBtn = QPushButton('Max')
self.__maxBtn.setCheckable(True)
self.__fullScreenBtn = QPushButton('FullScreen')
self.__fullScreenBtn.setCheckable(True)
self.__closeBtn = QPushButton('Close')
self.__minBtn.clicked.connect(self.showMinimized)
self.__maxBtn.toggled.connect(self.__maximize)
self.__fullScreenBtn.toggled.connect(self.__fullScreen)
self.__closeBtn.clicked.connect(self.close)
lay = QHBoxLayout()
lay.addWidget(self.__fullScreenBtn)
lay.addWidget(self.__minBtn)
lay.addWidget(self.__maxBtn)
lay.addWidget(self.__closeBtn)
lay.setSpacing(0)
topWidget = QWidget()
topWidget.setLayout(lay)
lay = QVBoxLayout()
lay.addWidget(topWidget)
lay.addWidget(QTextBrowser())
self.setLayout(lay)
def __maximize(self, f):
if f:
self.showMaximized()
else:
self.showNormal()
def __fullScreen(self, f):
if f:
self.showFullScreen()
else:
self.showNormal()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
Result
Try to move and resize it.
Note: I tested in Windows 11, PySide6.
See Also
Classic version README - not using Windows API, qtpy, just good old PyQt5. Enable to resize and move as always. (clunky in Windows though)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for pyqt-frameless-window-0.0.71.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 766263eab68e6005651ba9a5d2442c391ed1edea0233cf401663135f50953fe7 |
|
MD5 | 10ff8f470e2ee09e1efe568d7cc93706 |
|
BLAKE2b-256 | 2b59ee791105d1c5292c9462a1fa02b5d3ec5b2e97817fce7d31b8f95228065e |
Hashes for pyqt_frameless_window-0.0.71-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c3a3c55733272903b685b4a3c86d367eb688249af6b236907a10f24175881d8d |
|
MD5 | 9af2612202f1d2416604a85c590698f0 |
|
BLAKE2b-256 | 614ff6d235ca423cccfb7fc488bc7b6dc49b592ae90450c5ed0aa33f6ab20837 |