简体   繁体   English

PyQt5 将 QLabel 插入 QLabel

[英]PyQt5 Insert QLabel into QLabel

I'm trying to make an interface and I want to insert Qlabel and Qbutton inside qlabel while keeping the resize feature as QVBoxLayout and QHBoxLayout do.我正在尝试制作一个界面,我想在 qlabel 中插入 Qlabel 和 Qbutton ,同时保持 QVBoxLayout 和 QHBoxLayout 的调整大小功能。

This is what I want to accomplish but with the change in size as QVBoxLayout and QHBoxLayout do.这就是我想要完成的,但是随着 QVBoxLayout 和 QHBoxLayout 的大小变化。 在此处输入图像描述

My code:我的代码:

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_())

After executing the code, this is what I get:执行代码后,这是我得到的: 在此处输入图像描述

The result I want to get.我想要得到的结果。 When the screen is enlarged, all the elements must be in place, and this cannot be done by QVBoxLayout and QHBoxLayout.屏幕放大时,所有元素都必须到位,而这是QVBoxLayout和QHBoxLayout做不到的。 在此处输入图像描述

For PyQt6... I'm using this "hack" to do what you're asking because I don't have the proper skills do it the right way, so I'm using QLabels for everything...对于 PyQt6 ......我正在使用这个“黑客”来做你所要求的,因为我没有正确的技能以正确的方式去做,所以我使用 QLabels 来做所有事情......

class Trigger(QObject):
    event_highjack = pyqtSignal()

    def __init__(s, triggerwidget, fn, resize=False, move=False, mousebutton=False, close=None):
        super().__init__(triggerwidget)
        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 = fn
        s._widget = triggerwidget
        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)


def follow_master():
    label.setGeometry(0,0,s.width(),s.height())

Trigger(s, resize=True, fn=follow_master) # s is main_window

I would use the Qt Designer for creating guis.我会使用 Qt Designer 来创建 gui。 You can place everything as you want and make it moving as you want.您可以随心所欲地放置所有东西并使其随心所欲地移动。 Plus gui coding and python coding is seperated and then its much easier to maintain.加上 gui 编码和 python 编码是分开的,因此更容易维护。 You can load you gui with uic.loadUi(r"yourgui.ui", self)您可以使用 uic.loadUi(r"yourgui.ui", self) 加载您的 gui

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM