Resumo : neste tutorial, você aprenderá como usar a QTableWidget
classe para criar um widget de tabela.
Introdução à classe PyQt QTableWidget
A
classe permite criar um widget de tabela que exibe a forma tabular dos itens. Os itens no QTableWidget
são criados usando a QTableWidget
classe Item.QTableWidget
O seguinte cria um widget de tabela usando a QTableWidget
classe:
table = QTableWidget(parent)
Linguagem de código: Python ( python )
Este parent
é o widget pai ou a janela principal .
Depois de ter um QTableWidget
objeto, você pode definir o número de colunas da tabela usando o setColumnCount()
método:
table.setColumnCount(columns)
Linguagem de código: Python ( python )
Para definir os rótulos horizontais para as colunas da tabela, você usa o setHorizontalHeaderLabels()
método:
table.setHorizontalHeaderLabels(labels)
Linguagem de código: Python ( python )
Cada coluna possui um índice começando em zero. Para cada coluna, você pode configurar sua largura usando o setColumnWidth()
método:
table.setColumnWidth(column, width)
Linguagem de código: Python ( python )
Para definir o número de linhas da tabela, você usa o setRowCount()
método:
table.setRowCount(rows)
Linguagem de código: Python ( python )
Se você souber o número de linhas e colunas que a tabela pode ter no momento da criação, poderá usar o seguinte:
table = QTableWidget(rows, columns, parent)
Linguagem de código: PHP ( php )
Para adicionar um item à tabela, você usa o setItem()
método:
table.setItem(row, column, item)
Linguagem de código: Python ( python )
Exemplo PyQt QTableWidget
Desenvolveremos um aplicativo que usa um QTableWidget
para gerenciar dados de funcionários:
Se você inserir o nome, sobrenome e idade e clicar em adicionar, o programa adicionará o novo funcionário à tabela. Além disso, se você selecionar uma linha e clicar no ícone de exclusão, a tabela excluirá a linha.
Aqui está o programa completo:
import sys
from PyQt6.QtWidgets import (
QApplication, QMainWindow, QTableWidget,
QTableWidgetItem, QDockWidget, QFormLayout,
QLineEdit, QWidget, QPushButton, QSpinBox,
QMessageBox, QToolBar, QMessageBox
)
from PyQt6.QtCore import Qt,QSize
from PyQt6.QtGui import QIcon, QAction
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle('Employees')
self.setWindowIcon(QIcon('./assets/usergroup.png'))
self.setGeometry(100, 100, 600, 400)
employees = [
{'First Name': 'John', 'Last Name': 'Doe', 'Age': 25},
{'First Name': 'Jane', 'Last Name': 'Doe', 'Age': 22},
{'First Name': 'Alice', 'Last Name': 'Doe', 'Age': 22},
]
self.table = QTableWidget(self)
self.setCentralWidget(self.table)
self.table.setColumnCount(3)
self.table.setColumnWidth(0, 150)
self.table.setColumnWidth(1, 150)
self.table.setColumnWidth(2, 50)
self.table.setHorizontalHeaderLabels(employees[0].keys())
self.table.setRowCount(len(employees))
row = 0
for e in employees:
self.table.setItem(row, 0, QTableWidgetItem(e['First Name']))
self.table.setItem(row, 1, QTableWidgetItem(e['Last Name']))
self.table.setItem(row, 2, QTableWidgetItem(str(e['Age'])))
row += 1
dock = QDockWidget('New Employee')
dock.setFeatures(QDockWidget.DockWidgetFeature.NoDockWidgetFeatures)
self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, dock)
# create form
form = QWidget()
layout = QFormLayout(form)
form.setLayout(layout)
self.first_name = QLineEdit(form)
self.last_name = QLineEdit(form)
self.age = QSpinBox(form, minimum=18, maximum=67)
self.age.clear()
layout.addRow('First Name:', self.first_name)
layout.addRow('Last Name:', self.last_name)
layout.addRow('Age:', self.age)
btn_add = QPushButton('Add')
btn_add.clicked.connect(self.add_employee)
layout.addRow(btn_add)
# add delete & edit button
toolbar = QToolBar('main toolbar')
toolbar.setIconSize(QSize(16,16))
self.addToolBar(toolbar)
delete_action = QAction(QIcon('./assets/remove.png'), '&Delete', self)
delete_action.triggered.connect(self.delete)
toolbar.addAction(delete_action)
dock.setWidget(form)
def delete(self):
current_row = self.table.currentRow()
if current_row < 0:
return QMessageBox.warning(self, 'Warning','Please select a record to delete')
button = QMessageBox.question(
self,
'Confirmation',
'Are you sure that you want to delete the selected row?',
QMessageBox.StandardButton.Yes |
QMessageBox.StandardButton.No
)
if button == QMessageBox.StandardButton.Yes:
self.table.removeRow(current_row)
def valid(self):
first_name = self.first_name.text().strip()
last_name = self.last_name.text().strip()
if not first_name:
QMessageBox.critical(self, 'Error', 'Please enter the first name')
self.first_name.setFocus()
return False
if not last_name:
QMessageBox.critical(self, 'Error', 'Please enter the last name')
self.last_name.setFocus()
return False
try:
age = int(self.age.text().strip())
except ValueError:
QMessageBox.critical(self, 'Error', 'Please enter a valid age')
self.age.setFocus()
return False
if age <= 0 or age >= 67:
QMessageBox.critical(
self, 'Error', 'The valid age is between 1 and 67')
return False
return True
def reset(self):
self.first_name.clear()
self.last_name.clear()
self.age.clear()
def add_employee(self):
if not self.valid():
return
row = self.table.rowCount()
self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(
self.first_name.text().strip())
)
self.table.setItem(
row, 1, QTableWidgetItem(self.last_name.text())
)
self.table.setItem(
row, 2, QTableWidgetItem(self.age.text())
)
self.reset()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
Linguagem de código: Python ( python )
Como funciona.
Primeiro, inicialize uma lista de funcionários como uma lista de dicionários:
employees = [
{'First Name': 'John', 'Last Name': 'Doe', 'Age': 25},
{'First Name': 'Jane', 'Last Name': 'Doe', 'Age': 22},
{'First Name': 'Alice', 'Last Name': 'Doe', 'Age': 22},
]
Linguagem de código: Python ( python )
Segundo, crie um novo QTableWidget
e defina-o como widget central da janela principal:
self.table = QTableWidget(self)
self.setCentralWidget(self.table)
Linguagem de código: Python ( python )
Terceiro, defina o número de colunas da tabela e configure a largura das colunas:
self.table.setColumnCount(3)
self.table.setColumnWidth(0, 150)
self.table.setColumnWidth(1, 150)
self.table.setColumnWidth(2, 50)
Linguagem de código: Python ( python )
Quarto, defina os cabeçalhos horizontais da tabela:
self.table.setHorizontalHeaderLabels(employees[0].keys())
Linguagem de código: Python ( python )
Quinto, defina a contagem de linhas como o número de itens na employees
lista:
self.table.setRowCount(len(employees))
Linguagem de código: Python ( python )
Sexto, adicione cada funcionário dos funcionários à tabela:
row = 0
for e in employees:
self.table.setItem(row, 0, QTableWidgetItem(e['First Name']))
self.table.setItem(row, 1, QTableWidgetItem(e['Last Name']))
self.table.setItem(row, 2, QTableWidgetItem(str(e['Age'])))
row += 1
Linguagem de código: Python ( python )
Sétimo, defina o delete()
método que será executado quando o usuário selecionar uma linha e clicar no botão excluir na barra de ferramentas :
def delete(self):
current_row = self.table.currentRow()
if current_row < 0:
return QMessageBox.warning(self, 'Warning','Please select a record to delete')
button = QMessageBox.question(
self,
'Confirmation',
'Are you sure that you want to delete the selected row?',
QMessageBox.StandardButton.Yes |
QMessageBox.StandardButton.No
)
if button == QMessageBox.StandardButton.Yes:
self.table.removeRow(current_row)
Linguagem de código: Python ( python )
O currenRow()
método retorna a linha atualmente selecionada. Retorna -1 se nenhuma linha for selecionada. Neste caso, utilizamos o QMessageBox
para emitir uma mensagem de aviso.
Se o usuário selecionar uma linha, usamos QMessageBox
para levantar uma questão para confirmar a exclusão. Se o usuário clicar OK
, usamos o removeRow()
método QTableWidget
para excluir a linha selecionada.
Oito, defina o add_employee()
método para adicionar um novo funcionário à mesa:
def add_employee(self):
if not self.valid():
return
row = self.table.rowCount()
self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(self.first_name.text().strip()))
self.table.setItem(row, 1, QTableWidgetItem(self.last_name.text()))
self.table.setItem(row, 2, QTableWidgetItem(self.age.text()))
self.reset()
Linguagem de código: Python ( python )
O add_employee()
método faz o seguinte:
- Valide o funcionário usando o
valid()
método. - Anexe uma nova linha à tabela usando o
insertRow()
método. - Defina o item para cada coluna da linha recém-inserida. usando o
setItem()
método. - Redefina o formulário do funcionário usando o
reset()
método.
Resumo
- Use a
QTableWidget
classe para criar um widget de tabela. - Use os métodos
setColumnCount()
esetRowCount()
para definir as colunas e linhas da tabela. - Use o
setHorizontalHeaderLabels()
método para definir os cabeçalhos horizontais da tabela. - Use a
QTableWidgetItem
classe para criar um item de tabela. - Use o
setItem()
método para definir um item para a tabela. - Use o
currentRow()
método para obter a linha atualmente selecionada. - Use o
insertRow()
método para inserir uma nova linha na tabela. - Use o
deleteRow()
método para excluir uma linha da tabela.