PyQt QTableWidget

Resumo : neste tutorial, você aprenderá como usar a QTableWidgetclasse para criar um widget de tabela.

Introdução à classe PyQt QTableWidget

A QTableWidgetclasse permite criar um widget de tabela que exibe a forma tabular dos itens. Os itens no QTableWidgetsão criados usando a QTableWidgetclasse Item.

O seguinte cria um widget de tabela usando a QTableWidgetclasse:

table = QTableWidget(parent)Linguagem de código:  Python  ( python )

Este parenté o widget pai ou a janela principal .

Depois de ter um QTableWidgetobjeto, 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 QTableWidgetpara 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 QTableWidgete 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 employeeslista:

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 QMessageBoxpara emitir uma mensagem de aviso.

Se o usuário selecionar uma linha, usamos QMessageBoxpara levantar uma questão para confirmar a exclusão. Se o usuário clicar OK, usamos o removeRow()método QTableWidgetpara 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 QTableWidgetclasse para criar um widget de tabela.
  • Use os métodos setColumnCount()e setRowCount()para definir as colunas e linhas da tabela.
  • Use o setHorizontalHeaderLabels()método para definir os cabeçalhos horizontais da tabela.
  • Use a QTableWidgetItemclasse 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *