- 1. Introduction
- 2. widgets.py
- 3. init .py
- 4. Conclusion
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
- 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
And then we will create an application window
- 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())
Conclusion
You will find the code for this project in the example repository. Do not forget to star repository.
спасибо ещё раз. огромное, за уделённое время
Добрый день.
Спасибо за статью, очень помогла. По есть вопрос:
А как быть, если значения для 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))
Если не прав, админ поправит)