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)
请注意,您的代码还有很多其他问题,以下是最重要的问题:
盒子布局addWidget()
的第二个参数是stretch,如果你只想指定对齐方式,你必须使用它关键词:
self.vbox.addWidget(self.groupBox, alignment=Qt.AlignCenter)
在这种特定情况下,无论如何都没有必要,因为必须在容器上设置居中对齐;
您对标签几何体的实现是错误的,因为它基于滚动容器几何体,但标签是分组框的子项:实际上,您只能看到第一个标签团体; label positions should be set using the group box 坐标系(no mul
);
除了上面解释的之外,总是不鼓励使用固定的几何图形,尤其是在处理文本元素时(你不知道用户字体、字体缩放和 DPI),因为它通常会导致在部分隐藏或重叠的文本中;您应该始终喜欢 layout managers,因为它们将确保所有小部件始终具有显示其内容所需的所有 space;注意:您应该在 all 界面中使用布局,而不仅仅是在滚动的小部件中;只有极少数情况下固定几何形状实际上更可取,并且在完成时非常小心并且 实际 了解 Qt 和 UI 通常如何工作;
在循环中设置实例属性是没有意义的,因为它们会在每个循环中被覆盖;只使用局部变量,因为父小部件的所有权将确保它们引用的对象不会被删除;
因为您总是使用相同的字体,所以在每个循环中都创建新字体是错误的;只需在循环之外创建它们并为您需要的小部件设置它们;
虽然 Qt 允许设置非唯一的对象名称,但您不应该这样做;事实上,Qt 对象名称只应在实际需要时才设置:当访问动态创建的对象而不能以其他方式访问(例如使用 findChild
或 findChildren
)很重要时,或者如果您需要样式表中的对象名称选择器;
我有一个垂直布局的组框。我想将它对齐到中心但代码不是 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_())
程序输出的图像是。
当滚动区的widget不可调整大小时,必须设置alignment()
属性:
By default, the widget stays rooted to the top-left corner of the scroll area.
因此,您必须明确设置对齐方式:
self.scroll.setAlignment(Qt.AlignHCenter)
请注意,您的代码还有很多其他问题,以下是最重要的问题:
盒子布局
addWidget()
的第二个参数是stretch,如果你只想指定对齐方式,你必须使用它关键词:self.vbox.addWidget(self.groupBox, alignment=Qt.AlignCenter)
在这种特定情况下,无论如何都没有必要,因为必须在容器上设置居中对齐;
您对标签几何体的实现是错误的,因为它基于滚动容器几何体,但标签是分组框的子项:实际上,您只能看到第一个标签团体; label positions should be set using the group box 坐标系(no
mul
);除了上面解释的之外,总是不鼓励使用固定的几何图形,尤其是在处理文本元素时(你不知道用户字体、字体缩放和 DPI),因为它通常会导致在部分隐藏或重叠的文本中;您应该始终喜欢 layout managers,因为它们将确保所有小部件始终具有显示其内容所需的所有 space;注意:您应该在 all 界面中使用布局,而不仅仅是在滚动的小部件中;只有极少数情况下固定几何形状实际上更可取,并且在完成时非常小心并且 实际 了解 Qt 和 UI 通常如何工作;
在循环中设置实例属性是没有意义的,因为它们会在每个循环中被覆盖;只使用局部变量,因为父小部件的所有权将确保它们引用的对象不会被删除;
因为您总是使用相同的字体,所以在每个循环中都创建新字体是错误的;只需在循环之外创建它们并为您需要的小部件设置它们;
虽然 Qt 允许设置非唯一的对象名称,但您不应该这样做;事实上,Qt 对象名称只应在实际需要时才设置:当访问动态创建的对象而不能以其他方式访问(例如使用
findChild
或findChildren
)很重要时,或者如果您需要样式表中的对象名称选择器;