Evgenii Legotckoi
Nov. 9, 2019, 4:52 p.m.

PyQt5 - Tutorial 008. Working with QTableWidget (Update tutorial 006)

This will be a small update to the lesson on using QTableWidget in PyQt5

In the previous lesson it was shown how to display some kind of information in QTableWidget. And this lesson will also show how to make some cells editable and non-editable, as well as how to respond to keystrokes inside a QTableWidget

The application will look like this


Introduction

This addition was made at the request of one of the users. In particular, adding key tracking and customizing cell editing.

There was also a request to show how to do sorting by column. But I did not do this. The fact is that QTableWidget is primarily used to display widgets in the form of a table, and not for tabular data. Therefore, I strongly recommend that anyone who needs to display a text data table use QTableView and learn how to make a data model using QAbstractItemModel . There it is easier to do sorting using proxy models, and they are better suited for this.

Now back to the example.

widgets.py

First you need to create a custom 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

And then we will create an application window

  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.  

Conclusion

You will find the code for this project in the example repository. Do not forget to star repository.

Do you like it? Share on social networks!

b
  • Nov. 9, 2019, 7:28 p.m.

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

C
  • May 14, 2020, 2:28 a.m.

Добрый день.

Спасибо за статью, очень помогла. По есть вопрос:
А как быть, если значения для 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
  • May 14, 2020, 2:34 a.m.
  • (edited)

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • AK
    April 1, 2025, 11:41 a.m.
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup