- 1. Einführung
- 2. Widgets.py
- 3. init .py
- 4. Fazit
Dies wird ein kleines Update des Tutorials zur Verwendung von QTableWidget in PyQt5 sein.
Das vorherige Tutorial zeigte, wie einige Informationen in einem QTableWidget angezeigt werden. Und dieses Tutorial zeigt Ihnen auch, wie Sie einige Zellen bearbeitbar und nicht bearbeitbar machen und wie Sie auf Tastendrücke in einem QTableWidget reagieren.
Die Anwendung wird wie folgt aussehen
Einführung
Diese Ergänzung erfolgte auf Wunsch eines Benutzers. Insbesondere das Hinzufügen von Key-Tracking und die Optimierung der Zellenbearbeitung.
Es gab auch eine Anfrage, um zu zeigen, wie man nach einer Spalte sortiert. Aber ich tat es nicht. Der Punkt ist, dass QTableWidget hauptsächlich zum Anzeigen von Widgets als Tabelle verwendet wird, nicht für tabellarische Daten. Daher empfehle ich dringend, dass jeder, der eine Tabelle mit Textdaten anzeigen muss, QTableView verwendet und lernt, wie man ein Datenmodell mit QAbstractItemModel erstellt. Dort ist die Sortierung nach Proxy-Modellen einfacher und dafür besser geeignet.
Nun zurück zum Beispiel.
Widgets.py
Zuerst müssen Sie Ihr eigenes QTableWidget erstellen
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
Und dann erstellen wir das Anwendungsfenster
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())
Fazit
Den Code für dieses Projekt finden Sie im Beispielrepository. Vergessen Sie nicht, das Repository mit einem Sternchen zu markieren.
спасибо ещё раз. огромное, за уделённое время
Добрый день.
Спасибо за статью, очень помогла. По есть вопрос:
А как быть, если значения для 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))
Если не прав, админ поправит)