Cargar QTableWidgets en un área de desplazamiento con solo presionar un botón

Tengo un método llamado ‘test ()’ que carga 3 tablas de una fila en una barra de desplazamiento.

Sin embargo, por alguna razón no puedo entenderlo. Mientras tanto, funciona si simplemente activo test () en la carga, no funciona si lo comento y luego trato de activarlo presionando un botón.

Aquí está el módulo principal (con prueba ())

from PyQt5 import QtCore, QtWidgets from design import Ui_MainWindow class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): QtWidgets.QMainWindow.__init__(self, *args, **kwargs) self.setupUi(self) #test(self) def test(self): from random import randint x = randint(0, 99) print(x) height = 30 yPos = 0 for i in range(3): rowVals = ['test%s' % str(x + i)] qTbl = QtWidgets.QTableWidget(self.sawDoc) qTbl.setObjectName("tbl%s" % (i)) qTbl.setGeometry(QtCore.QRect(0, yPos, 880, height)) qTbl.horizontalHeader().setVisible(False) qTbl.verticalHeader().setVisible(False) yPos += height qTbl.setRowCount(1) qTbl.setColumnCount(len(rowVals)) for r, cell in enumerate(rowVals): item = QtWidgets.QTableWidgetItem() item.setText(str(cell)) qTbl.setItem(0, r, item) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec_()) 

Y aquí está el módulo de diseño (con el botón).

 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(896, 453) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.scrDoc = QtWidgets.QScrollArea(self.centralwidget) self.scrDoc.setGeometry(QtCore.QRect(0, 0, 891, 391)) self.scrDoc.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.scrDoc.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.scrDoc.setWidgetResizable(False) self.scrDoc.setObjectName("scrTest") self.sawDoc = QtWidgets.QWidget() self.sawDoc.setGeometry(QtCore.QRect(0, 0, 869, 300)) self.sawDoc.setObjectName("sawDoc") self.scrDoc.setWidget(self.sawDoc) self.btnTest = QtWidgets.QPushButton(self.centralwidget) self.btnTest.setGeometry(QtCore.QRect(430, 400, 80, 15)) self.btnTest.setObjectName("btnTest") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.btnTest.clicked.connect(self.test) def test(self): import main main.test(self) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "昊珩のCAT工具")) self.btnTest.setText(_translate("MainWindow", "Test")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_()) 

Simplemente no sucede nada cuando presiono el botón (excepto para que la impresión funcione correctamente).

¿Alguien puede decir lo que está mal?

Los padres muestran a los niños al principio, pero luego es responsabilidad de los niños mostrarse a sí mismos, la solución simple es usar show() :

 qTbl = QtWidgets.QTableWidget(self.sawDoc) qTbl.show() 

Pero veo que está implementando la solución de manera poco elegante, la conexión lo hace en main.py, no modifique el archivo generado por Qt Designer (elimine la conexión y el método de prueba en design.py) Debe usar un diseño y allí agregar el QTableWidget.

 class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): QtWidgets.QMainWindow.__init__(self, *args, **kwargs) self.setupUi(self) self.btnTest.clicked.connect(self.test) def test(self): from random import randint x = randint(0, 99) lay = QtWidgets.QVBoxLayout(self.sawDoc) for i in range(3): rowVals = ['test%s' % str(x + i)] qTbl = QtWidgets.QTableWidget() qTbl.setObjectName("tbl%s" % (i)) qTbl.horizontalHeader().hide() qTbl.verticalHeader().hide() qTbl.setRowCount(1) qTbl.setColumnCount(len(rowVals)) for r, cell in enumerate(rowVals): item = QtWidgets.QTableWidgetItem() item.setText(str(cell)) qTbl.setItem(0, r, item) qTbl.resize(qTbl.sizeHint()) lay.addWidget(qTbl)