I create a frameless dialog and plan to add widgets in cont_wgt.
from PySide6.QtGui import *
from PySide6.QtCore import *
from PySide6.QtWidgets import *
class def_dlg(QDialog):
def __init__(self, parent=None):
super(def_dlg, self).__init__(parent)
self.setupUi()
self._init_main_window()
self._initDrag()
self.setMouseTracking(True)
self._close_max_min_icon()
self.my_Qss()
self.head.installEventFilter(self)
self.main_wgt.installEventFilter(self)
def setupUi(self):
self.resize(360, 160)
self.main_lyt = QVBoxLayout(self)
self.main_lyt.setContentsMargins(0, 0, 0, 0)
self.main_lyt.setSpacing(0)
self.head = QWidget(self)
self.head.setFixedHeight(30)
self.head.setObjectName("head")
self.head_lyt = QHBoxLayout(self.head)
self.head_lyt.setContentsMargins(0, 0, 0, 0)
self.head_lyt.setSpacing(0)
spacerItem = QSpacerItem(5, 20, QSizePolicy.Maximum, QSizePolicy.Minimum)
self.head_lyt.addItem(spacerItem)
self.icon_lbl = QLabel(self.head)
self.icon_lbl.setFixedSize(20, 20)
self.head_lyt.addWidget(self.icon_lbl)
spacerItem1 = QSpacerItem(5, 20, QSizePolicy.Maximum, QSizePolicy.Minimum)
self.head_lyt.addItem(spacerItem1)
self.title = QLabel(self.head)
sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(30)
sizePolicy.setHeightForWidth(self.title.sizePolicy().hasHeightForWidth())
self.title.setSizePolicy(sizePolicy)
self.head_lyt.addWidget(self.title)
spacerItem2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.head_lyt.addItem(spacerItem2)
self.pushButton = QPushButton(self.head)
self.pushButton.setObjectName("pushButton")
self.pushButton.setFixedSize(30, 20)
self.pushButton.clicked.connect(self.on_pushButton_clicked)
self.pushButton.setToolTip("<html><head/><body><p>Minimize</p></body></html>")
self.head_lyt.addWidget(self.pushButton)
spacerItem3 = QSpacerItem(3, 20, QSizePolicy.Maximum, QSizePolicy.Minimum)
self.head_lyt.addItem(spacerItem3)
self.pushButton_2 = QPushButton(self.head)
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_2.setFixedSize(30, 20)
self.pushButton_2.clicked.connect(self.on_pushButton_2_clicked)
self.pushButton_2.setToolTip("<html><head/><body><p>Maximize</p></body></html>")
self.head_lyt.addWidget(self.pushButton_2)
self.head_lyt.addItem(spacerItem3)
self.pushButton_3 = QPushButton(self.head)
self.pushButton_3.setFixedSize(30, 20)
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_3.clicked.connect(self.on_pushButton_3_clicked)
self.pushButton_3.setToolTip("<html><head/><body><p>Close</p></body></html>")
self.head_lyt.addWidget(self.pushButton_3)
spacerItem4 = QSpacerItem(5, 20, QSizePolicy.Maximum, QSizePolicy.Minimum)
self.head_lyt.addItem(spacerItem4)
self.main_lyt.addWidget(self.head)
self.main_wgt = QWidget(self)
self.main_wgt.setObjectName("main_wgt")
self.main_lyt.addWidget(self.main_wgt)
self.cont_lyt = QHBoxLayout()
self.cont_lyt.setContentsMargins(5, 0, 5, 5)
self.cont_wgt = QWidget(self)
self.cont_wgt.setStyleSheet("border:1px solid #999;")
self.cont_wgt.setObjectName("sub")
self.cont_lyt.addWidget(self.cont_wgt)
self.main_wgt.setLayout(self.cont_lyt)
def _init_main_window(self):
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.title.setStyleSheet('font-family:"Times New Roman";font-size:11px;')
def set_icon(self, path):
w = self.icon_lbl.width()
h = self.icon_lbl.height()
self.pix = QPixmap(path)
self.icon_lbl.setPixmap(self.pix)
self.icon_lbl.setScaledContents(True)
def _initDrag(self):
self._move_drag = False
self._corner_drag = False
self._bottom_drag = False
self._right_drag = False
def _close_max_min_icon(self):
self.pushButton_3.setText('r')
self.pushButton_2.setText('1')
self.pushButton.setText('0')
def on_pushButton_clicked(self):
self.showMinimized()
def on_pushButton_2_clicked(self):
if self.isMaximized():
self.showNormal()
self.pushButton_2.setText('1')
self.pushButton_2.setToolTip("<html><head/><body><p>maximum</p></body></html>")
else:
self.showMaximized()
self.pushButton_2.setText('2')
self.pushButton_2.setToolTip("<html><head/><body><p>restore</p></body></html>")
def on_pushButton_3_clicked(self):
self.close()
def eventFilter(self, obj, event):
if isinstance(event, QEnterEvent):
self.setCursor(Qt.ArrowCursor)
return super(def_dlg, self).eventFilter(obj, event)
def my_Qss(self):
qssStyle = '''
QWidget#head{
background-color:#eef0f6;
border-left:0.5px solid lightgray;
border-right:0.5px solid lightgray;
border-top:0.5px solid lightgray;
border-bottom:none;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
}
QWidget#main_wgt{
background-color:#eef0f6;
border-left:0.5px solid lightgray;
border-right:0.5px solid lightgray;
border-bottom:0.5px solid #e5e5e5;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
padding:5px 5px 5px 5px
}
QWidget#cont_wgt{
border: 1px solid #bbb; background-color: #ffffff;
}
QPushButton#pushButton {text-align:top;}
QPushButton#pushButton, QPushButton#pushButton_2, QPushButton#pushButton_3
{
font-family:"Webdings";
background:#ebecef;border-radius:5px;
border:1px solid rgba(120,160,255,60%);;
font-size:13px;
}
QPushButton#pushButton:hover, QPushButton#pushButton_2:hover, QPushButton#pushButton_3:hover{
border:1px solid rgba(120,160,255,60%);
background-color: QLinearGradient(y1: 0, y2: 1, stop: 0 rgba(0,0,0,30%), stop: 1 rgba(225,235,245,30%));
}
'''
self.setStyleSheet(qssStyle)
but when I have to add QPushButton in cont_widget, it seems I can’t use layout, which would let my button unclickable. How can I fix it?
I tried an add button in different ways, others are success, except button3.
from support import def_dlg
import sys
if __name__ == "__main__":
app = QApplication(sys.argv)
wgt = def_dlg()
wgt.title.setText("Proj_Create")
wgt.set_icon("./icons/icon/create16.png")
button1 = QPushButton("Button_1", wgt)
button2 = QPushButton("Button_2", wgt)
button3 = QPushButton("Button_3", wgt)
layout = wgt.cont_lyt
widget = wgt.cont_wgt
layout.addWidget(button1)
button2.move(100, 50)
sub_layout = QHBoxLayout(wgt)
sub_layout.addWidget(button3)
widget.setLayout(sub_layout)
wgt.resize(480, 270)
wgt.show()
sys.exit(app.exec())
enter image description here