我正在尝试创建一个接口,并希望在Qlabel中插入qlabel和Qbutton,同时像QVBoxLayout和QHBoxLayout一样保留调整大小的功能。
这是我想要完成的,但随着规模的改变,就像QVBoxLayout和QHBoxLayout一样。

我的代码:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(604, 460)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(0)
self.verticalLayout.setObjectName("verticalLayout")
self.frame = QtWidgets.QFrame(Form)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 9)
self.verticalLayout_2.setSpacing(0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label = QtWidgets.QLabel(self.frame)
self.label.setStyleSheet("QLabel {\n"
"background-color: #09102a;\n"
" }")
self.label.setText("")
self.label.setObjectName("label")
self.verticalLayout_2.addWidget(self.label)
self.frame_2 = QtWidgets.QFrame(self.frame)
self.frame_2.setMaximumSize(QtCore.QSize(16777215, 70))
self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_2.setObjectName("frame_2")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame_2)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label_2 = QtWidgets.QLabel(self.frame_2)
self.label_2.setMinimumSize(QtCore.QSize(120, 60))
self.label_2.setMaximumSize(QtCore.QSize(120, 60))
self.label_2.setStyleSheet("QLabel {\n"
" font: 75 13pt \"MS Shell Dlg 2\";\n"
" padding-right :5px;\n"
" padding-left :5px;\n"
" image: url(:/icons/images/icons/battery-monitoring.png);\n"
" image-position: left;\n"
" background-color: #171d3c;\n"
" border-radius :20px;\n"
" color: rgb(255, 255, 255);\n"
" }")
self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.label_2.setObjectName("label_2")
self.horizontalLayout.addWidget(self.label_2)
self.label_3 = QtWidgets.QLabel(self.frame_2)
self.label_3.setMinimumSize(QtCore.QSize(120, 60))
self.label_3.setMaximumSize(QtCore.QSize(120, 60))
self.label_3.setStyleSheet("QLabel {\n"
" font: 75 13pt \"MS Shell Dlg 2\";\n"
" padding-right :5px;\n"
" padding-left :5px;\n"
" image: url(:/icons/images/icons/battery-charger.png);\n"
" image-position: left;\n"
" background-color: #171d3c;\n"
" border-radius :20px;\n"
" color: rgb(255, 255, 255);\n"
" }")
self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.label_3.setObjectName("label_3")
self.horizontalLayout.addWidget(self.label_3)
self.verticalLayout_2.addWidget(self.frame_2)
self.verticalLayout.addWidget(self.frame)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label_2.setText(_translate("Form", "label 2"))
self.label_3.setText(_translate("Form", "label 1"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())在执行代码之后,我得到了以下内容:

我想得到的结果。当屏幕放大时,所有元素都必须就位,这不能由QVBoxLayout和QHBoxLayout完成。

发布于 2022-09-04 20:43:17
对于PyQt6..。我用这个“黑客”来做你要做的事,因为我没有适当的技能,所以我用QLabels做任何事情。
from PyQt6 import QtCore, QtWidgets
from PyQt6.QtCore import QEvent, QObject, pyqtSignal
import sys
class Trigger(QObject):
event_highjack = pyqtSignal()
def __init__(s, eventparent, master_fn=None, resize=False, move=False, mousebutton=False, close=None, fn=None):
super().__init__(eventparent)
for enum in [k for k,v in {14:resize, 13:move, 19:close, 2:mousebutton}.items() if v]:
s.eventtype = QEvent.type(QEvent(enum))
s.master_fn = master_fn or fn
s._widget = eventparent
s.widget.installEventFilter(s)
if s.master_fn:
s.event_highjack.connect(s.master_fn)
@property
def widget(s):
return s._widget
def eventFilter(s, widget, event) -> bool:
if widget == s._widget and event.type() == s.eventtype:
s.event_highjack.emit()
return super().eventFilter(widget, event)
class Main(QtWidgets.QMainWindow):
def __init__(s, *args, **kwargs):
super().__init__(styleSheet='background:black;color:white', *args, **kwargs)
s.show()
label = QtWidgets.QLabel(s, styleSheet='background:magenta')
label.show()
def follow_master():
label.setGeometry(10,10,s.width()-20,s.height()-20)
Trigger(s, resize=True, fn=follow_master)
if '__main__' in __name__:
app = QtWidgets.QApplication(sys.argv)
window = Main()
app.exec()发布于 2022-09-05 09:08:41
我会使用Qt设计器来创建guis。你可以随心所欲地放置所有的东西,并让它随你的意愿移动。另外,gui编码和python编码是分开的,然后它更容易维护。您可以用uic.loadUi加载gui (r“yourgui.ui”,self)
https://stackoverflow.com/questions/73478454
复制相似问题