QTableView: Vertical Header abhängig von sortByColumns

Alles rund um die Programmierung mit Qt
Antworten
xdecrepitx
Beiträge: 9
Registriert: 11. Juli 2007 23:32
Wohnort: Winterthur, Schweiz

QTableView: Vertical Header abhängig von sortByColumns

Beitrag von xdecrepitx »

Hallo zusammen,

ich habe eine QTableView welche mit Daten aus einem QSqlQueryModel resp. zwischengeschaltetem QSortFilterProxyModel abgefüllt wird.
Nach einigen Stunden im Schweisse meines Angesichts bin ich jetzt soweit, dass ich die View durch Klicken auf die Spaltenheader entsprechend sortieren kann. Dank mapToSource werden auch nach dem Sortieren die richtigen Records des QSqlQueryModels angesprochen, wenn ich etwas editieren will. Soweit also alles tipptopp.

Das Einzige was mir einfach nicht gelingen will, ist den Vertical Header der View quasi von der Sortierung auszuschliessen. Dieser zeigt ja an sich einfach die Zeilennummern an. Nach einer Sortierung gerät diese Nummerierung aber durcheinander weil die Werte irgendwie hart mit den Zeilen verknüpft zu sein scheinen.

Hat jemand eine Idee, wie so etwas zu bewerkstelligen ist? In den Examples konnte ich leider kein Beispiel finden, bei dem Sortierung mit Vertical Headers vorkommt. Immer nur das Eine oder Andere.

Verwendet wird Qt 4.2.3 mit MinGW unter Windows.

Codemässig sieht das Ganze etwa so aus (irrelevanten Code habe ich gelöscht):

1. Erstellen der QTableView:

Code: Alles auswählen

void MainWindow::createCustomerTable() {
	sourceModel			= new QSqlQueryModel(this);
	proxyModel			= new QSortFilterProxyModel(this);
	customerTableView	   = new QTableView;
	horizHeader			= new QHeaderView(Qt::Horizontal, customerTableView);
	vertHeader			= new QHeaderView(Qt::Vertical, customerTableView);
	
        proxyModel->setSourceModel(sourceModel);
	customerTableView->setModel(proxyModel);
	
        customerTableView->setHorizontalHeader(horizHeader);
	customerTableView->setVerticalHeader(vertHeader);
	customerTableView->setObjectName("customerTableViewId");
	customerTableView->setSortingEnabled(false);
	
        connect(customerTableView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(on_customerTableView_currentRowChanged(const QModelIndex &)));
	connect(horizHeader, SIGNAL(sectionClicked(int)), this, SLOT(on_horizHeader_sectionClicked(int)));
}
2. Abfüllen der Daten nachdem eine Suche getätigt wurde

Code: Alles auswählen

void MainWindow::writeCustomerTable(QSqlQuery &query) {
	const QModelIndex	invalidIndex = QModelIndex(); // wird wohl für removeColumns gebraucht
		
	sourceModel->setQuery(query);
	sourceModel->removeColumns(10, 1, invalidIndex);
	
        customerTableView->setSortingEnabled(true);
	customerTableView->sortByColumn(1,Qt::AscendingOrder);
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

ProxyModel dazwischenschalten, Header selbst generieren
Antworten