Qt.AlignHCenter 不工作,标签不显示文本

Qt.AlignHCenter not working and labels not displaying text

我有一个垂直布局的组框。我想将它对齐到中心但代码不是 working.The 另一个问题是组框的标签只显示一次文本(注意: 组框在 for环形)。我用谷歌搜索但找不到任何 result.Here 是导入代码

from PyQt5.QtCore import (QRect, QSize,)
from PyQt5.QtGui import (QFont)
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5 import QtCore, QtGui, QtWidgets

因为我没有导入它(导入PyQt5.Qt) 我认为这不相关,但滚动区域的代码是。

        self.subwin = QtWidgets.QScrollArea(self.centralwidget)
        self.subwin.setGeometry(QtCore.QRect(70, 70, 531, 251))
        self.subwin.setStyleSheet("background-image:")
        self.subwin.setWidgetResizable(True)
        self.subwin.setObjectName("subwin")
        self.scroll = QScrollArea()
        self.widget = QWidget()
        self.vbox = QVBoxLayout()
        self.subwin.setWidget(self.scroll)

滚动区域的其他描述在for循环之后。 for循环如下

        for i in dat:
            lsst = i.split("|")
            g_y = 20
            l_y = 15
            l2n3_y = 40
        

            self.groupBox = QtWidgets.QGroupBox(self.scroll)
#            self.groupBox.setGeometry(QtCore.QRect(50, g_y + 90 * mul, 431, 85))
            self.groupBox.setTitle("")
            self.groupBox.setObjectName("groupBox")
            self.groupBox.setMinimumSize(QSize(400, 81))
            self.groupBox.setMaximumSize(QSize(431, 85))
            self.label = QLabel(self.groupBox)
            self.label.setObjectName(u"label")
            self.label.setGeometry(QRect(35, l_y + 90 * mul, 371, 21))
            font = QFont()
            font.setBold(True)
            font.setWeight(75)
            self.label.setFont(font)
            self.label.setIndent(-1)
            self.label_2 = QLabel(self.groupBox)
            self.label_2.setObjectName(u"label_2")
            self.label_2.setGeometry(QRect(35, l2n3_y + 90 * mul, 371, 16))
            font1 = QFont()
            font1.setFamily(u"Arial")
            font1.setPointSize(8)
            font1.setBold(False)
            font1.setWeight(50)
            self.label_2.setFont(font1)
            self.label_2.setIndent(-1)
            self.label_3 = QLabel(self.groupBox)
            self.label_3.setObjectName(u"label_3")
            self.label_3.setGeometry(QRect(360, l2n3_y + 90 * mul, 91, 16))
            self.label_3.setFont(font1)
            self.label_3.setIndent(-1)
            mul = mul + 1
            self.label.setText(lsst[0])
            self.label_2.setText(lsst[1])
            self.label_3.setText("res=" + lsst[2])
            self.vbox.addWidget(self.groupBox, Qt.AlignCenter)

        self.widget.setLayout(self.vbox)        
        self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scroll.setWidgetResizable(False)
        self.scroll.setGeometry(QtCore.QRect(0, 0, 529, 249))

        self.scroll.setWidget(self.widget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Yotube Video Downloader"))
        self.b1.setStatusTip(_translate("MainWindow", "Click to start the Download"))
        self.b1.setText(_translate("MainWindow", "Download"))
        self.input.setStatusTip(_translate("MainWindow", "Enter URL"))
        self.input.setText(_translate("MainWindow", "Paste Url Here"))
        self.b2.setStatusTip(_translate("MainWindow", "Select Resolution"))
        self.b2.setText(_translate("MainWindow", "Resolution"))
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle('fusion')
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

程序输出的图像是。 GitHub link to the file

当滚动区的widget不可调整大小时,必须设置alignment() 属性:

By default, the widget stays rooted to the top-left corner of the scroll area.

因此,您必须明确设置对齐方式:

self.scroll.setAlignment(Qt.AlignHCenter)

请注意,您的代码还有很多其他问题,以下是最重要的问题:

  1. 盒子布局addWidget()的第二个参数是stretch,如果你只想指定对齐方式,你必须使用它关键词:

     self.vbox.addWidget(self.groupBox, alignment=Qt.AlignCenter)
    

    在这种特定情况下,无论如何都没有必要,因为必须在容器上设置居中对齐;

  2. 您对标签几何体的实现是错误的,因为它基于滚动容器几何体,但标签是分组框的子项:实际上,您只能看到第一个标签团体; label positions should be set using the group box 坐标系(no mul);

  3. 除了上面解释的之外,总是不鼓励使用固定的几何图形,尤其是在处理文本元素时(你不知道用户字体、字体缩放和 DPI),因为它通常会导致在部分隐藏或重叠的文本中;您应该始终喜欢 layout managers,因为它们将确保所有小部件始终具有显示其内容所需的所有 space;注意:您应该在 all 界面中使用布局,而不仅仅是在滚动的小部件中;只有极少数情况下固定几何形状实际上更可取,并且在完成时非常小心并且 实际 了解 Qt 和 UI 通常如何工作;

  4. 在循环中设置实例属性是没有意义的,因为它们会在每个循环中被覆盖;只使用局部变量,因为父小部件的所有权将确保它们引用的对象不会被删除;

  5. 因为您总是使用相同的字体,所以在每个循环中都创建新字体是错误的;只需在循环之外创建它们并为您需要的小部件设置它们;

  6. 虽然 Qt 允许设置非唯一的对象名称,但您不应该这样做;事实上,Qt 对象名称只应在实际需要时才设置:当访问动态创建的对象而不能以其他方式访问(例如使用 findChildfindChildren)很重要时,或者如果您需要样式表中的对象名称选择器;