Spaltenbreite einer QTableView programmatisch anpassen

Alles rund um die Programmierung mit Qt
Antworten
Nukleus
Beiträge: 44
Registriert: 16. April 2010 13:32

Spaltenbreite einer QTableView programmatisch anpassen

Beitrag von Nukleus »

Hallo,

ich habe eine Applikation, in der mehrere Tabellen (beruhend auf QTableView, QStandarditemModel) erzeugt werden. Reihenfolge,Beschriftungstext und Breite der einzelnen Spalten lese ich aus einer MySQL-Datenbank.
Die (von links her gesehen) letzte Spalte der Tabelle hat einen besonderen Wert für die Spaltenbreite, bei dem ich den resizeMode der Spalte auf "Stretch" setze. Alle anderen Spalten erhalten den resizeMode "interactive", so daß ich die Breite der Spalte ggf. händisch anpassen kann.

Die Applikation läuft derzeit unter Leap 42.3 und Qt 5.6.3.

Ich habe nun eine Box mit Leap 15.0 und habe mich mal daran gemacht, meine Applikation auf Leap 15.0 mit Qt 5.9.4 zu portieren. Die gesamte Applikation übersetzt fehlerfrei, Änderungen waren keine notwendig. Die Datenbank habe ich unter 42.3 exportiert und in 15.0 importiert.
Wenn ich die Applikation dann unter Leap 15.0 starte, dann sieht es so aus, als hätten sämtliche Spalten meiner Tabelle einheitliche Spaltenbreite. Auch die Spalte mit resizeMode "Stretch" hat diese feste Breite.
Die Beschriftung jeder Spalte ist korrekt (d.h. aus der Datenbank wird richtig gelesen), ich habe das Leseregebnis aus der Datenbank auch überprüft, es war ok.

In der Dokumentation von QHeaderView in Qt 5.9.4 habe ich nichts gefunden, was darin anders wäre als unter Qt 5.6.3.

Meine Frage: hat jemand dieses Verhalten auch schon gehabt und was war die Ursache, gab es eine Lösung?, habe ich ggf. etwas übersehen?

Für Tips wäre ich dankbar.
Nukleus
Beiträge: 44
Registriert: 16. April 2010 13:32

Re: Spaltenbreite einer QTableView programmatisch anpassen

Beitrag von Nukleus »

... noch eine zusätzliche Information:

Meine Applikation enthält nicht nur Tabellen, die von QTableView abgeleitet sind, sondern auch Tabellen, die von QTreeView abgeleitet sind.

Ausnahmslos alle QTableView-Tabellen zeigen das im Orginal-Beitrag genannte Verhalten.

Ausnahmslos keine der QTreeView-Tabellen zeigen das im Orginal-Beitrag genannte Verwalten. D.h. die TreeViews sehen so aus, wie sie es sollen (d.h. von mir beabsichtigt).
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Spaltenbreite einer QTableView programmatisch anpassen

Beitrag von Christian81 »

Wie setzt Du denn die Spaltenbreiten?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nukleus
Beiträge: 44
Registriert: 16. April 2010 13:32

Re: Spaltenbreite einer QTableView programmatisch anpassen

Beitrag von Nukleus »

Gerne, nachfolgend der Code:

Code: Alles auswählen

           if((hSection.section(';',5,5).toInt() != 0)	&&		/* Frage: Section fuers Programm resize?	*/
	      (hSection.section(';',3,3)         == "TRUE"))		/* die sichtbar ist?				*/
	   {								/* wenn ja...					*/
              phHeader->resizeSection(hSection.section(';',0,0).toInt(),/* diese Section anpassen			*/
			           hSection.section(';',5,5).toInt());	/*						*/
#ifdef QT4_SUPPORT	      
              phHeader->setResizeMode (sect,QHeaderView::Interactive);	/* ResizeMode setzen				*/
#endif
#ifdef QT5_SUPPORT	      
              phHeader->setSectionResizeMode (sect,QHeaderView::Interactive);/* ResizeMode setzen			*/
#endif
	   };								/* Ende Frage: Programm resize verlangt, ja		*/
Die Variable phHeader zeigt auf die QHeaderView des horizontalen Headers. Die Variable QT4_SUPPORT / QT5_SUPPORT werden durch qmake errechnet und deklariert. Ich habe auch überprüft, daß der QT5_SUPPORT-Zweig definitiv durchlaufen wird.
Wie erwähnt: Unter Qt 5.6.2 und Leap 42.3 läuft das Ganze ohne Probleme.

Noch eine Beobachtung: Ich verbinde das Signal sectionResized mit einem eigenen Slot. Wenn das Signal zuschlägt, dann schreibe ich die neuen aktuellen Headerwerte in die Datenbank. Wenn ich also die Breite einer Spalte händisch anpasse, dann steht der aktuelle Wert für die Spaltenbreite in der Datenbank. Damit bleiben die geänderten Werte über den Neustart der Applikation erhalten.

Selbst wenn ich jetzt (unter Leap 15.0 und Qt 5.9.3) manuell etwas an einer Spalte ändere (d.h. deren Breite), bleiben die alten Werte in der Datenbank stehen, d.h. mein Signal kommt nicht.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Spaltenbreite einer QTableView programmatisch anpassen

Beitrag von Christian81 »

So ganz verstehe ich nicht was da passieren soll. Du meinst dass das Signal sectionResized() nicht kommt wenn die Größe der section geändert wird, richtig?
Der Code funktioniert prima:

Code: Alles auswählen

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTableWidget tw(5,2);
    QObject::connect(tw.horizontalHeader(), &QHeaderView::sectionResized,
                     [&tw](int logicalIndex, int oldSize, int newSize)
                     {
                         qDebug() << logicalIndex << oldSize << newSize;
                     });
    tw.show();
    return app.exec();
}
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nukleus
Beiträge: 44
Registriert: 16. April 2010 13:32

Re: Spaltenbreite einer QTableView programmatisch anpassen

Beitrag von Nukleus »

... da muß ich mich entschuldigen: Bei mir kommt das Signal auch.

Am Problem selbst ändert das aber nichts. Um es kurz zu machen: Ich verwende die Funktion resizeSection, um einer Header Section eine andere Breite zu geben.
Wenn ich den Header einer QTableView aufbaue, dann lese ich aus der Datenbank (u.a.) die Soll-Breite jeder Spalte und setze jede Sektion des Headers entsprechend. Das funktioniert unter Qt 5.6.3 und Leap 42.3 so wie beabsichtigt.
Unter Leap 15.0 und Qt 5.9.2 erhalten alle Spalten einheitlich die Breite von 100 px (wenn das Fenster groß genug ist).

Ich habe immer eine Spalte in der Tabelle, die den restlichen (verbleibenden) Platz verbraucht. Wenn ich unter 42.3/5.6.3 die Breite einer (nicht stretch-) Spalte ändere, dann ändert sich die Stretch-Spalte entsprechend.

Unter 15.0 / Qt 5.9.4 erhalten alle Spalten einheitliche Breite, auch die Stretch-Spalte.

Ich verwende ein und dieselbe Funktion zur Anpassung des Headers einer QTreeView und da funktiontiert meine Funktion immer (unter 42.3/5.6.3 und unter 15.0 / 5.9.4)
Nukleus
Beiträge: 44
Registriert: 16. April 2010 13:32

Re: Spaltenbreite einer QTableView programmatisch anpassen

Beitrag von Nukleus »

... das Thema hier kann geschlossen werden.

Ich habe testweise eine kleine Applikation geschrieben, bei der untereinander eine QTableView und eine QTreeView mit jeweils 3 Spalten dargestellt werden. Die Breite von 2 der 3 Spalten wurde programmatisch gesetzt, die 3. Spalte erhielt die Eigenschaft Stretch.

Ergebnis: Sowohl unter Leap 15 / Qt 5.9.2 wie unter Leap 42.3 / Qt 5.6.3 wurden die Spalten richtig dargestellt.

Im Code meiner Orginalapplikation muß es deshalb einen Fehler geben, den ich nur suchen, finden und beseitigen muß. Es handelt sich hier defintiv nicht um ein allgemeines Problem.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Spaltenbreite einer QTableView programmatisch anpassen

Beitrag von Christian81 »

Wenn Du das Problem mit 5.12 hättest würde ich sagen ich hätte Ideen warum dem so ist, aber mit 5.9 eher nicht. Die einzige Idee die ich habe ist, dass dein resize zu früh kommt, d.h. die Initialisierung noch nicht abgeschlossen ist. Einfach mal einen Slot an sectionResized connecten, dort einen Breakpoint rein und den Backtrace anschauen woher und wann es aufgerufen wird.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten