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