- 1. Вступление
- 2. widgets.py
- 3. init .py
- 4. Вывод
Это будет небольшое обновление урока по использованию QTableWidget в PyQt5.
В предыдущем уроке было показано, как вывести какую-то информацию в QTableWidget. И этот урок также покажет, как сделать некоторые ячейки редактируемыми и нередактируемыми, а также как реагировать на нажатия клавиш внутри QTableWidget.
Приложение будет выглядеть так
Вступление
Это дополнение было сделано по просьбе одного из пользователей. В частности, добавление отслеживания клавиш и настройка редактирования ячеек.
Также была просьба показать, как сделать сортировку по столбцу. Но я этого не сделал. Дело в том, что QTableWidget в первую очередь используется для отображения виджетов в виде таблицы, а не для табличных данных. Поэтому я настоятельно рекомендую всем, кому необходимо отобразить таблицу текстовых данных, использовать QTableView и научиться создавать модель данных с помощью QAbstractItemModel . Там проще делать сортировку по прокси-моделям, и они лучше подходят для этого.
Теперь вернемся к примеру.
widgets.py
Сначала вам нужно создать собственный QTableWidget
from PyQt5.QtCore import Qt from PyQt5.QtGui import QKeyEvent from PyQt5.QtWidgets import QTableWidget # We create custom QTableWidget for react to key press events class CustomTableWidget(QTableWidget): # override keyPressEvent def keyPressEvent(self, e: QKeyEvent) -> None: if e.key() == Qt.Key_Enter: print("Key enter was pressed") elif e.key() == Qt.Key_Return: print("Key return was pressed")
init .py
А затем мы создадим окно приложения
from PyQt5.QtCore import QSize, Qt from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, QTableWidgetItem from widgets import CustomTableWidget # Inheriting from QMainWindow class MainWindow(QMainWindow): # Overriding the class constructor def __init__(self): # Be sure to call the super class method QMainWindow.__init__(self) self.setMinimumSize(QSize(480, 80)) # Set sizes self.setWindowTitle("Работа с QTableWidget") # Set the window title central_widget = QWidget(self) # Create a central widget self.setCentralWidget(central_widget) # Install the central widget grid_layout = QGridLayout() # Create a QGridLayout central_widget.setLayout(grid_layout) # Install this placement in the central widget table = CustomTableWidget(self) # Create a table table.setColumnCount(3) # We install three columns table.setRowCount(1) # and one row in the table # Set table headers table.setHorizontalHeaderLabels(["Header 1", "Header 2", "Header 3"]) # Set tooltips for headers table.horizontalHeaderItem(0).setToolTip("Column 1 ") table.horizontalHeaderItem(1).setToolTip("Column 2 ") table.horizontalHeaderItem(2).setToolTip("Column 3 ") # Set the alignment to the headers table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignLeft) table.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter) table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignRight) # fill the first line table.setItem(0, 0, self.createItem("Text in column 1", Qt.ItemIsSelectable | Qt.ItemIsEnabled)) table.setItem(0, 1, self.createItem("Text in column 2", Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable)) table.setItem(0, 2, self.createItem("Text in column 3", Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable)) # do column resizing by content table.resizeColumnsToContents() grid_layout.addWidget(table, 0, 0) # Add a table to the grid def createItem(self, text, flags): tableWidgetItem = QTableWidgetItem(text) tableWidgetItem.setFlags(flags) return tableWidgetItem if __name__ == "__main__": import sys app = QApplication(sys.argv) mw = MainWindow() mw.show() sys.exit(app.exec())
Вывод
Вы найдете код для этого проекта в репозитории примеров. Не забудьте пометить репозиторий звездочкой.
спасибо ещё раз. огромное, за уделённое время
Добрый день.
Спасибо за статью, очень помогла. По есть вопрос:
А как быть, если значения для 1 столбца нужно брать из словаря?
При таком коде:
for i,entry in enumerate(commands):
ui.tableWidget.setRowCount(i+1)
ui.tableWidget.setItem(0, i, commands)
получаю ошибку:
argument 3 has unexpected type 'dict'
ну setRowCount это не совсем корректно в данном случае, лучше использовать insertRow. Второе, в setItem третий аргумент должен быть типа QTableWidgetItem То есть строка должна выглядеть ui.tableWidget.setItem(0,i, QTableWidgetItem(commands))
Если не прав, админ поправит)