Qscrollbar в PyQt5 ничего не отображается - PullRequest
0 голосов
/ 25 октября 2018

Мне нужно добавить информацию о студентах (она выглядит как таблица) в окно.Это делается с помощью функции addStudentStats и добавляется в основной виджет.Я пытался заставить другой виджет вставить полосу прокрутки, и этот виджет вставить в основной.Но это не сработало.Затем я попытался сделать все окно прокручиваемым, но тоже не смог.Если кто-то может написать эти несколько строк кода (я думаю, что их мало, но я не знаю, какие именно), я был бы рад.

Читайте здесь

Я добавил полосу прокрутки в свое окно.Программа заполняет его данными, которые идут вниз по экрану, но я не могу прокрутить

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

1 Ответ

0 голосов
/ 25 октября 2018

Проблема проста: QScrollArea - это контейнер, который служит для отображения другого виджета большого размера, и этот виджет - это то, что вы передаете через метод setWidget().QScrollArea вычисляет необходимый размер, используя sizeHint() виджета, поэтому в вашем случае проблема, вызывающая проблему, заключается в том, что виджет, поскольку его sizeHint() равен 0, 0.Почему это 0, 0?потому что внутри него ничего нет, поскольку метки являются потомками QScrollArea, а не виджета, и даже если у него нет sizeHint(), поскольку есть как минимум 2 способа их вычисления: макет дает вам эту информацию, но вв вашем случае вы используете его, а второй - установить фиксированный размер для виджета, и это решение, которое я выбрал, я не знаю, если это то, что вы хотите, так как я не знаю, какой тип вывода вы хотите,но вы можете видеть, что 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)

enter image description here

, поэтому, если вы собираетесь добавить больше элементов, вам придется рассчитатьи установите setFixedHeight(), другой вариант - использовать макеты, но, поскольку я не знаю, какой дизайн вы ожидаете, я не смогу предоставить вам второе решение.

...