PyQt5 中的 Qscrollbar 没有显示
Qscrollbar in PyQt5 nothing is shown
我需要将学生信息(看起来像 table)添加到 window。它是在一个名为 "addStudentStats" 的函数中完成的,并被添加到一个主窗口小部件中。我试图让另一个小部件插入滚动条,而这个小部件插入到一个主要的小部件中。但它没有用。然后我试图使整个 window 可滚动,但我也做不到。如果有人能写出那几行代码(我觉得很少,不知道是哪几行)我会很高兴。
阅读此处
我在 window 中添加了一个滚动条。程序用数据填充它,它在屏幕上向下移动,但我无法滚动
from PyQt5.QtWidgets import QPushButton, QWidget, QLabel,QScrollArea, QApplication, QMainWindow
from PyQt5.QtCore import Qt
import sys
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.uiMain = UIMainTeacher()
self.setUpUI(self)
def setUpUI(self, MainWindow):
MainWindow.setGeometry(50, 50, 400, 450)
MainWindow.setFixedSize(1800, 1000)
MainWindow.setWindowTitle("Login")
self.uiMain = UIMainTeacher()
self.gotoTeacher()
def gotoTeacher(self):
self.uiMain.setupUI(self, type)
self.show()
class UIMainTeacher(object):
def setupUI(self, MainWindow, userId):
MainWindow.setGeometry(50, 50, 400, 450)
MainWindow.setFixedSize(1800, 1000)
MainWindow.setWindowTitle("Main")
self.mainWindow = MainWindow
self.centralwid = QScrollArea(MainWindow)
self.centralwid.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.centralwidget = QWidget(self.centralwid)
self.exitButton = QPushButton("Exit", self.centralwid)
self.exitButton.move(1700, 0)
self.CourseLabel = QLabel("No Kourse yet", self.centralwid)
self.CourseLabel.move(900, 20)
self.AddCourseButton = QPushButton('Add Course', self.centralwid)
self.AddCourseButton.move(1700, 25)
self.CourseLabel = QLabel("Course", self.centralwidget)
self.CourseLabel.move(900, 20)
self.AddStudentsButton = QPushButton("Add Students", self.centralwid)
self.AddStudentsButton.move(1700, 100)
self.taskLabel = QLabel("TASKS:", self.centralwidget)
self.taskLabel.move(160, 20)
self.AddTaskButton = QPushButton('Add Task', self.centralwid)
self.AddTaskButton.move(1700, 50)
self.centralwid.setWidget(self.centralwidget)
MainWindow.setCentralWidget(self.centralwid)
x, y = 600, 0
for _ in range(200):
label = QLabel("Test Test", self.centralwid)
label.move(x, y)
y += 50
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
sys.exit(app.exec_())
问题很简单 QScrollArea 是一个容器,用于显示另一个具有较大尺寸的小部件,而该小部件就是您通过 setWidget()
方法传递的内容。 QScrollArea 使用小部件的 sizeHint()
计算必要的大小,因此在您的情况下,引起问题的是那个小部件,因为它的 sizeHint()
是 0, 0
。为什么是0, 0
?因为它里面什么都没有,因为标签是 QScrollArea
的子项而不是小部件,即使它没有 sizeHint()
因为至少有两种计算它们的方法:布局给你该信息,但在您的情况下您使用它,第二个是为小部件设置固定大小,这是我选择的解决方案,我不知道它是否是您想要的,因为我不知道是什么类型的你想要的输出,但你可以看到 QScrollArea
是可见的。
class UIMainTeacher(object):
def setupUI(self, MainWindow):
MainWindow.setGeometry(50, 50, 400, 450)
MainWindow.setFixedSize(1800, 1000)
MainWindow.setWindowTitle("Main")
self.mainWindow = MainWindow
self.centralwid = QScrollArea(MainWindow)
self.centralwid.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.centralwidget = QWidget(self.centralwid)
self.exitButton = QPushButton("Exit", self.centralwid)
self.exitButton.move(1700, 0)
self.CourseLabel = QLabel("No Kourse yet", self.centralwid)
self.CourseLabel.move(900, 20)
self.AddCourseButton = QPushButton('Add Course', self.centralwid)
self.AddCourseButton.move(1700, 25)
self.CourseLabel = QLabel("Course", self.centralwidget)
self.CourseLabel.move(900, 20)
self.AddStudentsButton = QPushButton("Add Students", self.centralwid)
self.AddStudentsButton.move(1700, 100)
self.taskLabel = QLabel("TASKS:", self.centralwidget)
self.taskLabel.move(160, 20)
self.AddTaskButton = QPushButton('Add Task', self.centralwid)
self.AddTaskButton.move(1700, 50)
self.centralwid.setWidget(self.centralwidget)
MainWindow.setCentralWidget(self.centralwid)
x, y = 600, 0
for _ in range(200):
label = QLabel("Test Test", self.centralwidget)
label.move(x, y)
y += 50
self.centralwidget.setFixedWidth(800)
self.centralwidget.setFixedHeight(y)
因此,如果您要添加更多元素,则必须计算并设置 setFixedHeight()
,另一种选择是使用布局,但由于我不知道您期望的设计是什么,所以我无法做到为您提供第二个解决方案。
我需要将学生信息(看起来像 table)添加到 window。它是在一个名为 "addStudentStats" 的函数中完成的,并被添加到一个主窗口小部件中。我试图让另一个小部件插入滚动条,而这个小部件插入到一个主要的小部件中。但它没有用。然后我试图使整个 window 可滚动,但我也做不到。如果有人能写出那几行代码(我觉得很少,不知道是哪几行)我会很高兴。
阅读此处
我在 window 中添加了一个滚动条。程序用数据填充它,它在屏幕上向下移动,但我无法滚动
from PyQt5.QtWidgets import QPushButton, QWidget, QLabel,QScrollArea, QApplication, QMainWindow
from PyQt5.QtCore import Qt
import sys
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.uiMain = UIMainTeacher()
self.setUpUI(self)
def setUpUI(self, MainWindow):
MainWindow.setGeometry(50, 50, 400, 450)
MainWindow.setFixedSize(1800, 1000)
MainWindow.setWindowTitle("Login")
self.uiMain = UIMainTeacher()
self.gotoTeacher()
def gotoTeacher(self):
self.uiMain.setupUI(self, type)
self.show()
class UIMainTeacher(object):
def setupUI(self, MainWindow, userId):
MainWindow.setGeometry(50, 50, 400, 450)
MainWindow.setFixedSize(1800, 1000)
MainWindow.setWindowTitle("Main")
self.mainWindow = MainWindow
self.centralwid = QScrollArea(MainWindow)
self.centralwid.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.centralwidget = QWidget(self.centralwid)
self.exitButton = QPushButton("Exit", self.centralwid)
self.exitButton.move(1700, 0)
self.CourseLabel = QLabel("No Kourse yet", self.centralwid)
self.CourseLabel.move(900, 20)
self.AddCourseButton = QPushButton('Add Course', self.centralwid)
self.AddCourseButton.move(1700, 25)
self.CourseLabel = QLabel("Course", self.centralwidget)
self.CourseLabel.move(900, 20)
self.AddStudentsButton = QPushButton("Add Students", self.centralwid)
self.AddStudentsButton.move(1700, 100)
self.taskLabel = QLabel("TASKS:", self.centralwidget)
self.taskLabel.move(160, 20)
self.AddTaskButton = QPushButton('Add Task', self.centralwid)
self.AddTaskButton.move(1700, 50)
self.centralwid.setWidget(self.centralwidget)
MainWindow.setCentralWidget(self.centralwid)
x, y = 600, 0
for _ in range(200):
label = QLabel("Test Test", self.centralwid)
label.move(x, y)
y += 50
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
sys.exit(app.exec_())
问题很简单 QScrollArea 是一个容器,用于显示另一个具有较大尺寸的小部件,而该小部件就是您通过 setWidget()
方法传递的内容。 QScrollArea 使用小部件的 sizeHint()
计算必要的大小,因此在您的情况下,引起问题的是那个小部件,因为它的 sizeHint()
是 0, 0
。为什么是0, 0
?因为它里面什么都没有,因为标签是 QScrollArea
的子项而不是小部件,即使它没有 sizeHint()
因为至少有两种计算它们的方法:布局给你该信息,但在您的情况下您使用它,第二个是为小部件设置固定大小,这是我选择的解决方案,我不知道它是否是您想要的,因为我不知道是什么类型的你想要的输出,但你可以看到 QScrollArea
是可见的。
class UIMainTeacher(object):
def setupUI(self, MainWindow):
MainWindow.setGeometry(50, 50, 400, 450)
MainWindow.setFixedSize(1800, 1000)
MainWindow.setWindowTitle("Main")
self.mainWindow = MainWindow
self.centralwid = QScrollArea(MainWindow)
self.centralwid.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.centralwidget = QWidget(self.centralwid)
self.exitButton = QPushButton("Exit", self.centralwid)
self.exitButton.move(1700, 0)
self.CourseLabel = QLabel("No Kourse yet", self.centralwid)
self.CourseLabel.move(900, 20)
self.AddCourseButton = QPushButton('Add Course', self.centralwid)
self.AddCourseButton.move(1700, 25)
self.CourseLabel = QLabel("Course", self.centralwidget)
self.CourseLabel.move(900, 20)
self.AddStudentsButton = QPushButton("Add Students", self.centralwid)
self.AddStudentsButton.move(1700, 100)
self.taskLabel = QLabel("TASKS:", self.centralwidget)
self.taskLabel.move(160, 20)
self.AddTaskButton = QPushButton('Add Task', self.centralwid)
self.AddTaskButton.move(1700, 50)
self.centralwid.setWidget(self.centralwidget)
MainWindow.setCentralWidget(self.centralwid)
x, y = 600, 0
for _ in range(200):
label = QLabel("Test Test", self.centralwidget)
label.move(x, y)
y += 50
self.centralwidget.setFixedWidth(800)
self.centralwidget.setFixedHeight(y)
因此,如果您要添加更多元素,则必须计算并设置 setFixedHeight()
,另一种选择是使用布局,但由于我不知道您期望的设计是什么,所以我无法做到为您提供第二个解决方案。