Lambda-Funktion als Slot
Verfasst: Freitag 11. September 2009, 10:56
Hallo Leute!
Ich habe ein QMainWindow, darin ein QTableWidget mit mehreren Spalten. Der Benutzer soll nun über einen Dialog auswählen können welche Spalten angezeigt werden sollen. Dazu wird dem Dialog das QTableWidget übergeben, dass zu jeder Spalte eine QCheckBox erstellt. Der Dialog soll nun ein Live-Dialog sein, d.h. wenn sich der Status einer Checkbox ändert, soll die Spalte direkt angezeigt oder versteckt werden. Dazu verbinde ich QCheckBox.toggeled mit einem Slot und genau hier liegt das Problem. QTableWidget.horizontalHeader.setSectionHidden erwartet den entgegengesetzten Wahrheitswert, wie den, der von QCheckBox.toggled kommt. Deshalb wollte ich eine eine lambda-Funktion übegeben, die den Status invertiert, komischerweise werden jetzt alle Änderungen nur auf die letzte Spalte angewandt...
Wo liegt der Fehler?
Hier der Dialog:
Und hier ein MainWindow, zum Ausprobieren:
Ich habe ein QMainWindow, darin ein QTableWidget mit mehreren Spalten. Der Benutzer soll nun über einen Dialog auswählen können welche Spalten angezeigt werden sollen. Dazu wird dem Dialog das QTableWidget übergeben, dass zu jeder Spalte eine QCheckBox erstellt. Der Dialog soll nun ein Live-Dialog sein, d.h. wenn sich der Status einer Checkbox ändert, soll die Spalte direkt angezeigt oder versteckt werden. Dazu verbinde ich QCheckBox.toggeled mit einem Slot und genau hier liegt das Problem. QTableWidget.horizontalHeader.setSectionHidden erwartet den entgegengesetzten Wahrheitswert, wie den, der von QCheckBox.toggled kommt. Deshalb wollte ich eine eine lambda-Funktion übegeben, die den Status invertiert, komischerweise werden jetzt alle Änderungen nur auf die letzte Spalte angewandt...
Wo liegt der Fehler?
Hier der Dialog:
Code: Alles auswählen
from PyQt4.QtGui import (QDialog, QVBoxLayout, QCheckBox,
QMainWindow, QTableWidget, QApplication)
from PyQt4.QtCore import Qt
class ColumnsDlg(QDialog):
def __init__(self, tableWidget, parent=None):
super(ColumnsDlg, self).__init__(parent)
model = tableWidget.model()
header = tableWidget.horizontalHeader()
layout = QVBoxLayout()
for i in range(model.columnCount()):
label = model.headerData(i, Qt.Horizontal).toString()
shown = not header.isSectionHidden(i)
cb = QCheckBox(label)
cb.setChecked(shown)
cb.stateChanged.connect(lambda shown: header.setSectionHidden(i, not shown))
layout.addWidget(cb)
self.setLayout(layout)
Code: Alles auswählen
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.table = QTableWidget()
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(["Name", "Adresse", "Telefon"])
self.setCentralWidget(self.table)
tableMenu = self.menuBar().addMenu("&Tabelle")
columnsAction = tableMenu.addAction("S&palten")
columnsAction.triggered.connect(self.showColumns)
self.resize(400, 300)
def showColumns(self):
dlg = ColumnsDlg(self.table, self)
dlg.show()
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec_())