- 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))
Если не прав, админ поправит)