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