Issue
I am attempting to create a frameless window to allow for a customizable title bar. However, I've encountered an issue with the QSizeGrip
not resizing my window as intended.
I've experimented with placing it in different sections of the code, but unfortunately, it hasn't proven effective. I also came across a suggestion that I need to create a resizeEvent for widgets. I tried implementing this, but it didn't seem to resolve the problem either. Could someone please assist me? Thank you.
Here is the code:
import sys
from PyQt5.QtCore import QPoint, Qt
from PyQt5.QtWidgets import QPushButton, QHBoxLayout, QVBoxLayout, \
QWidget, QLabel, QDialog, QSizeGrip, QMenuBar, QApplication
class TitleBar(QWidget):
height = 35
def __init__(self, parent):
super(TitleBar, self).__init__()
self.parent = parent
self.layout = QHBoxLayout()
self.layout.setContentsMargins(0, 0, 0, 0)
self.menu_bar = QMenuBar()
self.menu_bar.setStyleSheet("""
color: #fff;
background-color: #23272A;
font-size: 14px;
padding: 4px;
""")
self.menu_file = self.menu_bar.addMenu('File')
self.menu_file_quit = self.menu_file.addAction('Exit')
self.menu_file_quit.triggered.connect(self.parent.close)
self.menu_help = self.menu_bar.addMenu('Help')
self.layout.addWidget(self.menu_bar)
self.title = QLabel("Test")
self.title.setFixedHeight(self.height)
self.layout.addWidget(self.title, alignment=Qt.AlignCenter)
title_style = """
QLabel {
color: #ffffff; /* Text color (white) */
background-color: #23272a; /* Background color (dark grey) */
font-size: 18px; /* Font size */
font-weight: bold; /* Bold font */
padding: 8px; /* Padding around the text */
text-align: center; /* Horizontally center the text */
}
"""
self.title.setStyleSheet(title_style)
self.closeButton = QPushButton(' ')
self.closeButton.clicked.connect(self.on_click_close)
self.closeButton.setStyleSheet("""
background-color: #DC143C;
border-radius: 10px;
height: {};
width: {};
margin-right: 3px;
font-weight: bold;
color: #000;
font-family: "Webdings";
qproperty-text: "r";
""".format(self.height / 1.8, self.height / 1.8))
self.maxButton = QPushButton(' ')
self.maxButton.clicked.connect(self.on_click_maximize)
self.maxButton.setStyleSheet("""
background-color: #32CD32;
border-radius: 10px;
height: {};
width: {};
margin-right: 3px;
font-weight: bold;
color: #000;
font-family: "Webdings";
qproperty-text: "1";
""".format(self.height / 1.8, self.height / 1.8))
self.hideButton = QPushButton(' ')
self.hideButton.clicked.connect(self.on_click_hide)
self.hideButton.setStyleSheet("""
background-color: #FFFF00;
border-radius: 10px;
height: {};
width: {};
margin-right: 3px;
font-weight: bold;
color: #000;
font-family: "Webdings";
qproperty-text: "0";
""".format(self.height / 1.8, self.height / 1.8))
self.layout.addWidget(self.hideButton)
self.layout.addWidget(self.maxButton)
self.layout.addWidget(self.closeButton)
self.setLayout(self.layout)
self.start = QPoint(0, 0)
self.pressing = False
self.maximaze = False
def resizeEvent(self, QResizeEvent):
super(TitleBar, self).resizeEvent(QResizeEvent)
self.title.setFixedWidth(self.parent.width())
def mousePressEvent(self, event):
self.start = self.mapToGlobal(event.pos())
self.pressing = True
def mouseMoveEvent(self, event):
if self.pressing:
self.end = self.mapToGlobal(event.pos())
self.movement = self.end - self.start
self.parent.move(self.mapToGlobal(self.movement))
self.start = self.end
def mouseReleaseEvent(self, QMouseEvent):
self.pressing = False
def on_click_close(self):
self.parent.close()
def on_click_maximize(self):
self.maximaze = not self.maximaze
if self.maximaze: self.parent.setWindowState(Qt.WindowNoState)
if not self.maximaze:
self.parent.setWindowState(Qt.WindowMaximized)
def on_click_hide(self):
self.parent.showMinimized()
class StatusBar(QWidget):
def __init__(self, parent):
super(StatusBar, self).__init__()
self.initUI()
self.showMessage("***Test***")
def initUI(self):
self.label = QLabel("Status bar...")
self.label.setFixedHeight(24)
self.label.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
self.label.setStyleSheet("""
background-color: #23272a;
font-size: 12px;
padding-left: 5px;
color: white;
""")
self.layout = QHBoxLayout()
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.addWidget(self.label)
self.setLayout(self.layout)
def showMessage(self, text):
self.label.setText(text)
class MainWindow(QDialog):
def __init__(self):
QDialog.__init__(self)
self.setFixedSize(400, 200)
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)
self.setStyleSheet("background-color: #2c2f33;")
self.setWindowTitle('Test')
self.title_bar = TitleBar(self)
self.status_bar = StatusBar(self)
self.grip = QSizeGrip(self)
self.layout = QVBoxLayout()
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.addWidget(self.title_bar)
self.layout.addStretch(1)
self.layout.addWidget(self.grip, 0, Qt.AlignBottom | Qt.AlignRight)
self.layout.addWidget(self.status_bar)
self.layout.setSpacing(0)
self.setLayout(self.layout)
if __name__=='__main__':
app = QApplication(sys.argv)
myWindow = MainWindow()
myWindow.show()
sys.exit(app.exec_())
Solution
I think what to use
self.setFixedSize(400, 200)
this is overkill.
Try it.
Pay attention to the SizeGrip()
class.
main.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class TitleBar(QWidget):
height = 35
def __init__(self, parent):
super(TitleBar, self).__init__()
self.parent = parent
self.layout = QHBoxLayout()
self.layout.setContentsMargins(0, 0, 0, 0)
self.menu_bar = QMenuBar()
self.menu_bar.setStyleSheet("""
color: #fff;
background-color: #23272A;
font-size: 14px;
padding: 4px;
""")
self.menu_file = self.menu_bar.addMenu('File')
self.menu_file_quit = self.menu_file.addAction('Exit')
self.menu_file_quit.triggered.connect(self.parent.close)
self.menu_help = self.menu_bar.addMenu('Help')
self.layout.addWidget(self.menu_bar, alignment=Qt.AlignLeft)
self.title = QLabel("Test", alignment=Qt.AlignCenter)
self.title.setFixedHeight(self.height)
self.layout.addWidget(self.title, 1)
title_style = """
QLabel {
color: #ffffff; /* Text color (white) */
background-color: #23272a; /* Background color (dark grey) */
font-size: 18px; /* Font size */
font-weight: bold; /* Bold font */
padding: 8px; /* Padding around the text */
text-align: center; /* Horizontally center the text */
}
"""
self.title.setStyleSheet(title_style)
self.closeButton = QPushButton(' ')
self.closeButton.clicked.connect(self.on_click_close)
self.closeButton.setStyleSheet("""
background-color: #DC143C;
border-radius: 10px;
height: {};
width: {};
margin-right: 3px;
font-weight: bold;
color: #000;
font-family: "Webdings";
qproperty-text: "r";
""".format(self.height / 1.8, self.height / 1.8))
self.maxButton = QPushButton(' ')
self.maxButton.clicked.connect(self.on_click_maximize)
self.maxButton.setStyleSheet("""
background-color: #32CD32;
border-radius: 10px;
height: {};
width: {};
margin-right: 3px;
font-weight: bold;
color: #000;
font-family: "Webdings";
qproperty-text: "1";
""".format(self.height / 1.8, self.height / 1.8))
self.hideButton = QPushButton(' ')
self.hideButton.clicked.connect(self.on_click_hide)
self.hideButton.setStyleSheet("""
background-color: #FFFF00;
border-radius: 10px;
height: {};
width: {};
margin-right: 3px;
font-weight: bold;
color: #000;
font-family: "Webdings";
qproperty-text: "0";
""".format(self.height / 1.8, self.height / 1.8))
self.layout.addWidget(self.hideButton)
self.layout.addWidget(self.maxButton)
self.layout.addWidget(self.closeButton)
self.setLayout(self.layout)
self.start = QPoint(0, 0)
self.pressing = False
self.maximaze = False
# ? def resizeEvent(self, QResizeEvent):
# ? super(TitleBar, self).resizeEvent(QResizeEvent)
# ? self.title.setFixedWidth(self.parent.width())
def mousePressEvent(self, event):
self.start = self.mapToGlobal(event.pos())
self.pressing = True
def mouseMoveEvent(self, event):
if self.pressing:
self.end = self.mapToGlobal(event.pos())
self.movement = self.end - self.start
self.parent.move(self.mapToGlobal(self.movement))
self.start = self.end
def mouseReleaseEvent(self, QMouseEvent):
self.pressing = False
def on_click_close(self):
self.parent.close()
def on_click_maximize(self):
self.maximaze = not self.maximaze
if self.maximaze:
self.parent.setWindowState(Qt.WindowNoState)
if not self.maximaze:
self.parent.setWindowState(Qt.WindowMaximized)
def on_click_hide(self):
self.parent.showMinimized()
class StatusBar(QWidget):
def __init__(self, parent):
super(StatusBar, self).__init__()
self.initUI()
self.showMessage("***Test***")
def initUI(self):
self.label = QLabel("Status bar...")
self.label.setFixedHeight(24)
self.label.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
self.label.setStyleSheet("""
background-color: #23272a;
font-size: 12px;
padding-left: 5px;
color: white;
""")
self.layout = QHBoxLayout()
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.addWidget(self.label)
self.setLayout(self.layout)
def showMessage(self, text):
self.label.setText(text)
class SizeGrip(QSizeGrip): # +++
def __init__(self, parent):
super().__init__(parent)
self.parent = parent
parent.installEventFilter(self)
self.setFixedSize(25, 25)
self.polygon = QtGui.QPolygon([
QPoint(10, 20),
QPoint(20, 10),
QPoint(20, 20),
])
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.Resize:
geo = self.rect()
geo.moveBottomRight(source.rect().bottomRight())
self.setGeometry(geo)
return super().eventFilter(source, event)
def paintEvent(self, event):
qp = QPainter(self)
qp.setPen(Qt.white)
qp.setPen(Qt.white)
qp.drawPolygon(self.polygon)
class MainWindow(QDialog):
def __init__(self):
super().__init__()
# ??? self.setFixedSize(400, 200)
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)
self.setStyleSheet("background-color: #2c2f33;")
self.setWindowTitle('Test')
self.title_bar = TitleBar(self)
self.status_bar = StatusBar(self)
self.layout = QVBoxLayout()
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.addWidget(self.title_bar)
self.layout.addStretch(1)
# self.layout.addWidget(self.grip, 0, Qt.AlignBottom | Qt.AlignRight)
self.layout.addWidget(self.status_bar)
self.layout.setSpacing(0)
self.setLayout(self.layout)
self.grip = SizeGrip(self) # +++
if __name__=='__main__':
app = QApplication(sys.argv)
myWindow = MainWindow()
myWindow.resize(400, 200)
myWindow.show()
sys.exit(app.exec_())
Answered By - S. Nick
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.