versiones guia español descargar actualizar python checkbox pyqt qtablewidget pyqt5

python - guia - PyQt allign casilla de verificación y ponerlo en cada fila



qgis manual (2)

Podría considerar usar Qt Designer , para que pueda:

  • Obtenga su diseño deseado visualmente con comentarios inmediatos
  • Obtenga el código real generado a partir de él y descubra lo que le faltaba

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

pyuic5: compila las interfaces de usuario de Qt5 con el código de Python

Pasos

Pasos simples con un ejemplo

Crear y guardar la interfaz de usuario

Debe usar Qt Designer y guardar el archivo .ui.

Genera código Python desde el archivo UI

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

pyuic5 mainwindow.ui -o mainwindow.py

Actualiza tu código de Python

Obtenga su código 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 UI del módulo de Python que se generó, en nuestro caso el archivo mainwindow.py del comando en el anterior. paso.

La clase tiene automáticamente el prefijo Ui_ por parte de la utilidad. A continuación, QMainWindow una instancia de QMainWindow y la clase generada, y usa el método incorporado de Qt, setupUi para que incorpore 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 al usar 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 usando 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.

Estoy tratando de hacer esto con la casilla de verificación. Tristemente está hecho para C ++ y cualquier adaptación del código para Python tiene el resultado de este error: ''QWidget'' object is not callable Lo que quiero hacer es agregar una casilla de verificación 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() dice que no está implementado en Python. Entonces, ¿cómo puedo agregar esa casilla de verificación alineada en el centro sin el área de texto cerca para cada fila? Gracias de antemano por cualquier consejo.

EDITACIÓN posterior: mover el código dentro del ciclo está funcionando, pero no puedo controlar los controles:

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 revisé y crear una lista de conjuntos?


Aquí hay un ejemplo de ekhumoro para encontrar lo que se marca 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_())