Evgenii Legotckoi
Қар. 9, 2019, 4:52 Т.Қ.

PyQt5 - 008-сабақ. QTableWidget-пен жұмыс (006 сабақты жаңарту)

Это будет небольшое обновление урока по использованию QTableWidget в PyQt5.

В предыдущем уроке было показано, как вывести какую-то информацию в QTableWidget. И этот урок также покажет, как сделать некоторые ячейки редактируемыми и нередактируемыми, а также как реагировать на нажатия клавиш внутри QTableWidget.

Приложение будет выглядеть так


Вступление

Это дополнение было сделано по просьбе одного из пользователей. В частности, добавление отслеживания клавиш и настройка редактирования ячеек.

Также была просьба показать, как сделать сортировку по столбцу. Но я этого не сделал. Дело в том, что QTableWidget в первую очередь используется для отображения виджетов в виде таблицы, а не для табличных данных. Поэтому я настоятельно рекомендую всем, кому необходимо отобразить таблицу текстовых данных, использовать QTableView и научиться создавать модель данных с помощью QAbstractItemModel . Там проще делать сортировку по прокси-моделям, и они лучше подходят для этого.

Теперь вернемся к примеру.

widgets.py

Сначала вам нужно создать собственный QTableWidget

  1. from PyQt5.QtCore import Qt
  2. from PyQt5.QtGui import QKeyEvent
  3. from PyQt5.QtWidgets import QTableWidget
  4.  
  5.  
  6. # We create custom QTableWidget for react to key press events
  7. class CustomTableWidget(QTableWidget):
  8.  
  9. # override keyPressEvent
  10. def keyPressEvent(self, e: QKeyEvent) -> None:
  11. if e.key() == Qt.Key_Enter:
  12. print("Key enter was pressed")
  13. elif e.key() == Qt.Key_Return:
  14. print("Key return was pressed")
  15.  

init .py

А затем мы создадим окно приложения

  1. from PyQt5.QtCore import QSize, Qt
  2. from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, QTableWidgetItem
  3.  
  4. from widgets import CustomTableWidget
  5.  
  6.  
  7. # Inheriting from QMainWindow
  8. class MainWindow(QMainWindow):
  9. # Overriding the class constructor
  10. def __init__(self):
  11. # Be sure to call the super class method
  12. QMainWindow.__init__(self)
  13.  
  14. self.setMinimumSize(QSize(480, 80)) # Set sizes
  15. self.setWindowTitle("Работа с QTableWidget") # Set the window title
  16. central_widget = QWidget(self) # Create a central widget
  17. self.setCentralWidget(central_widget) # Install the central widget
  18.  
  19. grid_layout = QGridLayout() # Create a QGridLayout
  20. central_widget.setLayout(grid_layout) # Install this placement in the central widget
  21.  
  22. table = CustomTableWidget(self) # Create a table
  23. table.setColumnCount(3) # We install three columns
  24. table.setRowCount(1) # and one row in the table
  25.  
  26. # Set table headers
  27. table.setHorizontalHeaderLabels(["Header 1", "Header 2", "Header 3"])
  28.  
  29. # Set tooltips for headers
  30. table.horizontalHeaderItem(0).setToolTip("Column 1 ")
  31. table.horizontalHeaderItem(1).setToolTip("Column 2 ")
  32. table.horizontalHeaderItem(2).setToolTip("Column 3 ")
  33.  
  34. # Set the alignment to the headers
  35. table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignLeft)
  36. table.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter)
  37. table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignRight)
  38.  
  39. # fill the first line
  40. table.setItem(0, 0, self.createItem("Text in column 1", Qt.ItemIsSelectable | Qt.ItemIsEnabled))
  41. table.setItem(0, 1, self.createItem("Text in column 2", Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable))
  42. table.setItem(0, 2, self.createItem("Text in column 3", Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable))
  43.  
  44. # do column resizing by content
  45. table.resizeColumnsToContents()
  46.  
  47. grid_layout.addWidget(table, 0, 0) # Add a table to the grid
  48.  
  49. def createItem(self, text, flags):
  50. tableWidgetItem = QTableWidgetItem(text)
  51. tableWidgetItem.setFlags(flags)
  52. return tableWidgetItem
  53.  
  54.  
  55. if __name__ == "__main__":
  56. import sys
  57.  
  58. app = QApplication(sys.argv)
  59. mw = MainWindow()
  60. mw.show()
  61. sys.exit(app.exec())
  62.  

Вывод

Вы найдете код для этого проекта в репозитории примеров. Не забудьте пометить репозиторий звездочкой.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

b
  • Қар. 9, 2019, 7:28 Т.Қ.

спасибо ещё раз. огромное, за уделённое время

C
  • Мамыр 14, 2020, 2:28 Т.Ж.

Добрый день.

Спасибо за статью, очень помогла. По есть вопрос:
А как быть, если значения для 1 столбца нужно брать из словаря?
При таком коде:
for i,entry in enumerate(commands):
ui.tableWidget.setRowCount(i+1)
ui.tableWidget.setItem(0, i, commands)
получаю ошибку:
argument 3 has unexpected type 'dict'

b
  • Мамыр 14, 2020, 2:34 Т.Ж.
  • (өңделген)

ну setRowCount это не совсем корректно в данном случае, лучше использовать insertRow. Второе, в setItem третий аргумент должен быть типа QTableWidgetItem То есть строка должна выглядеть ui.tableWidget.setItem(0,i, QTableWidgetItem(commands))
Если не прав, админ поправит)

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз