PyQt allign checkbox y ponerlo en cada fila

Estoy tratando de hacer esto con la checkbox. Lamentablemente está hecho para C ++ y cualquier adaptación del código para Python tiene como resultado este error: 'QWidget' object is not callable Lo que quiero hacer es agregar una checkbox en cada fila, este es mi código:

  pWidget = QWidget() pCheckbox = QCheckBox() pLayout = QVBoxLayout() pLayout.addWidget(pCheckbox) pLayout.setAlignment(Qt.AlignCenter) pLayout.setContentsMargins(0, 0 ,0, 0) pWidget.setLayout(pLayout) for char in accounts: for columnNumber in range(numberColumns): chkBoxItem = QTableWidgetItem() chkBoxItem.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) chkBoxItem.setCheckState(Qt.Unchecked) self.mainAccountTable.insertRow(currentRowCount) self.mainAccountTable.setItem(currentRowCount, 0, pWidget(chkBoxItem)) self.mainAccountTable.setItem(currentRowCount, 1, QTableWidgetItem(data[1])) 

Si pongo pLayout = Layout() está diciendo que no está implementado en Python. Entonces, ¿cómo puedo agregar esa checkbox alineada en el centro sin el área de texto cerca de cada fila? Gracias de antemano por cualquier consejo.

EDITAR más tarde: mover el código dentro del bucle está funcionando, pero no puedo controlar las comprobaciones:

 for char in accounts: for columnNumber in range(numberColumns): pWidget = QWidget() pCheckbox = QCheckBox() pLayout = QVBoxLayout(pWidget) pLayout.addWidget(pCheckbox) pLayout.setAlignment(Qt.AlignCenter) pLayout.setContentsMargins(0, 0 ,0, 0) pWidget.setLayout(pLayout) #chkBoxItem = QTableWidgetItem() #chkBoxItem.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) #chkBoxItem.setCheckState(Qt.Unchecked) self.mainAccountTable.insertRow(currentRowCount) self.mainAccountTable.setCellWidget(currentRowCount, 0, pWidget) 

Esta es una captura de pantalla ¿Cómo puedo saber lo que verifiqué y construí la lista de conjuntos?

Aquí hay un ejemplo de ekhumoro para encontrar lo que se comprueba cuando se hace clic:

 from PyQt4 import QtGui, QtCore class Window(QtGui.QWidget): def __init__(self, rows, columns): QtGui.QWidget.__init__(self) self.table = QtGui.QTableWidget(rows, columns, self) for column in range(columns): for row in range(rows): item = QtGui.QTableWidgetItem('Text%d' % row) if row % 2: item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled) item.setCheckState(QtCore.Qt.Unchecked) self.table.setItem(row, column, item) self.table.itemClicked.connect(self.handleItemClicked) layout = QtGui.QVBoxLayout(self) layout.addWidget(self.table) self._list = [] def handleItemClicked(self, item): if item.checkState() == QtCore.Qt.Checked: print('"%s" Checked' % item.text()) self._list.append(item.row()) print(self._list) else: print('"%s" Clicked' % item.text()) if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) window = Window(6, 3) window.resize(350, 300) window.show() sys.exit(app.exec_()) 

Pero también puede iterar en sus filas y usar .findChild(type(QtGui.QCheckBox())).isChecked() en la columna correcta

como :

 from PyQt4 import QtGui, QtCore from PyQt4.QtCore import Qt class Window(QtGui.QWidget): def __init__(self, rows, columns): QtGui.QWidget.__init__(self) self.table = QtGui.QTableWidget(rows, columns, self) for row in range(rows): qwidget = QtGui.QWidget() checkbox = QtGui.QCheckBox() checkbox.setCheckState(QtCore.Qt.Unchecked) qhboxlayout = QtGui.QHBoxLayout(qwidget) qhboxlayout.addWidget(checkbox) qhboxlayout.setAlignment(Qt.AlignCenter) qhboxlayout.setContentsMargins(0, 0, 0, 0) self.table.setCellWidget(row, 0, qwidget) self.table.setItem(row, 1, QtGui.QTableWidgetItem(str(row))) layout = QtGui.QVBoxLayout(self) self.button = QtGui.QPushButton() self.button.setObjectName("loadButton") layout.addWidget(self.table) layout.addWidget(self.button) self.button.clicked.connect(self.ButtonClicked) def ButtonClicked(self): checked_list = [] for i in range(self.table.rowCount()): if self.table.cellWidget(i, 0).findChild(type(QtGui.QCheckBox())).isChecked(): checked_list.append(self.table.item(i, 1).text()) print checked_list if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) window = Window(3, 2) window.resize(350, 300) window.show() sys.exit(app.exec_()) 

Podría considerar usar el Diseñador Qt , de modo que pueda:

  • Obtenga su diseño deseado visualmente con retroalimentación inmediata
  • Ve a ver el código real generado a partir de él y descubre lo que te faltaba

Después de obtener la ventana deseada (es decir, el archivo con la extensión .ui ), puede usar la utilidad pyuic5 [1], que generará un archivo Python desde el archivo UI. De la página del manual

pyuic5 – comstack interfaces de usuario Qt5 a código Python

Pasos

Pasos simples con ejemplo

Crear y guardar la interfaz de usuario

Debe usar el Diseñador Qt y guardar el archivo .ui.

Generar código Python desde el archivo UI

Si su archivo .ui se llama mainwindow.ui entonces puede usar el comando:

 pyuic5 mainwindow.ui -o mainwindow.py 

Actualiza tu código Python

Obtenga su código de Python para usar el archivo UI basado en Python generado.

 from PyQt5.QtWidgets import QMainWindow from mainwindow import Ui_MainWindow # <<--- important # Set up the user interface from Designer. win = QMainWindow() gui = Ui_MainWindow() gui.setupUi(win) 

Como puede ver arriba, necesita importar la clase que representa la interfaz de usuario del módulo Python que se generó, en nuestro caso el archivo mainwindow.py del comando en la mainwindow.py anterior. paso.

La clase es automáticamente prefijada con Ui_ por la utilidad. Luego QMainWindow una instancia de QMainWindow y la clase generada y utiliza el método setupUi de setupUi para incorporar todos los widgets, etc.

Importante: cada vez que actualice su ventana en Qt Designer, deberá repetir el paso # 2. Teniendo en cuenta la cantidad de tiempo ahorrado usando el Diseñador directamente, esto no debería ser un problema.

Nota: Puede usar el archivo mainwindow.py generado para leer el código y ver cómo se logró el diseño deseado. Esto debería ser útil si realmente no desea continuar utilizando este enfoque.

[1] El comando pyuic5 se encuentra dentro del pyqt5-dev-tools , por lo que un sudo apt-get install pyqt5-dev-tools debería hacerlo.