为什么在创建大量 QPushButtons 时使用 PyQt5 获取 Python 很慢?

Why get's Python with PyQt5 slow when creating a large amount of QPushButtons?

我正在用 PyQt5 构建一个更大的程序。我想在 ScrollArea 中创建大量可点击的 QPushButton。

据我所知,该程序目前运行正常,但当按钮数量变多时(大约 10,000 到 20,000 个字符),它变得非常慢。

如何确保此程序构建这些按钮具有响应性?我需要加载由字符分隔的文本文件作为 QPushButtons,它们通常大约 15-20 kb(有时高达 50 kb)。我相信,这不应该是一个大小限制。

import sys
from PyQt5.QtWidgets import QApplication, QGridLayout, QScrollArea, QPushButton, QVBoxLayout, QWidget

class Widget(QWidget):

    def __init__(self, parent= None):
        super(Widget, self).__init__()
        self.setFixedHeight(200)
        self.setFixedWidth(1000)
        self.setGeometry(50, 100, 600, 500)

        widget = QWidget()
        layout = QVBoxLayout(self)

        grid = QGridLayout()
        gridpos = [0, 0]
        number = 15000
        for i in range(number):
            btn = QPushButton('x')
            btn.setCheckable(True)
            grid.addWidget(btn, *gridpos)
            gridpos[1] += 1
            if gridpos[1] == 10:
                gridpos[0] += 1
                gridpos[1] = 0
        layout.addLayout(grid)
        widget.setLayout(layout)

        scroll = QScrollArea()
        scroll.setWidgetResizable(False)
        scroll.setWidget(widget)

        vLayout = QVBoxLayout(self)
        vLayout.addWidget(scroll)
        self.setLayout(vLayout)

if __name__ == '__main__':
    app = QApplication(sys.argv)

    dialog = Widget()
    dialog.show()

    app.exec_()

显然,大量的 qpushbuttons "expensive" 会减慢程序速度。因此,似乎没有办法立即生成 10,000 到 20,000 个 qpushbuttons。

然而,有效的是仅显示可见按钮并在它们在 window 中可见时生成新按钮。