首页 > 解决方案 > Qt.AlignHCenter 不工作,标签不显示文本

问题描述

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

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

因为我没有正确导入它(import 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 链接

标签: pythonpyqt5

解决方案


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

默认情况下,小部件保持在滚动区域的左上角。

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

self.scroll.setAlignment(Qt.AlignHCenter)

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

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

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

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

  2. 您对标签几何的实现是错误的,因为它基于滚动容器几何,但标签是组框的子项:实际上,您只能看到第一组的标签;标签位置应使用组框坐标系(否mul)设置;

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

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

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

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


推荐阅读