- 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 # Ми створюємо власний QTableWidget для реагування на події натискання клавіш class CustomTableWidget(QTableWidget): # переобумовленої 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 # Спадкування від QMainWindow class MainWindow(QMainWindow): # Overriding the class constructor def __init__(self): # Обов'язково викличте метод суперкласу QMainWindow.__init__(self) self.setMinimumSize(QSize(480, 80)) # встановити розміри self.setWindowTitle("Работа с QTableWidget") # Встановіть заголовок вікна central_widget = QWidget(self) # Створити центральний віджет self.setCentralWidget(central_widget) # Встановити центральний віджет grid_layout = QGridLayout() # створити QGridLayout central_widget.setLayout(grid_layout) # Встановіть це розміщення в центральному віджеті table = CustomTableWidget(self) # створити таблицю table.setColumnCount(3) # Ми встановлюємо три колони table.setRowCount(1) # і один ряд в таблиці # Встановити заголовки таблиці table.setHorizontalHeaderLabels(["Header 1", "Header 2", "Header 3"]) # Встановити підказки для заголовків table.horizontalHeaderItem(0).setToolTip("Column 1 ") table.horizontalHeaderItem(1).setToolTip("Column 2 ") table.horizontalHeaderItem(2).setToolTip("Column 3 ") # Встановіть вирівнювання до заголовків table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignLeft) table.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter) table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignRight) # заповніть перший рядок 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)) # змінити розмір стовпця за вмістом 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))
Если не прав, админ поправит)