Problem mit horizontaler Scrollbar von QTreeView

Alles rund um die Programmierung mit Qt
Antworten
Marcel
Beiträge: 6
Registriert: 8. März 2006 00:28

Problem mit horizontaler Scrollbar von QTreeView

Beitrag von Marcel »

Hallo,

ich habe ein Problem mit dem QTreeView: die horizontale Scrollbar verhält sich nicht mehr ordnungsgemäss, sobald ich mit setColumnHidden() die Spalten verstecke. Dann nämlich erkennt das Widget nicht mehr die tatsächlich beanspruchte Grösse des Inhalts, sodass entweder gar kein horizontaler Scrollbalken erscheint oder wenn ich ihn mit setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn ) permanent einschalte, dieser nichts zum scrollen hat.

Folgendes Programm zeigt das Problem:

Datei Test.h:

Code: Alles auswählen

#ifndef TEST_H_
#define TEST_H_

#include <qmainwindow.h>

class QWidget;
class QTreeView;
class QDirModel;

class Test : public QMainWindow
{
   Q_OBJECT
public:
   Test (QWidget * parent = 0, Qt::WFlags flags = 0);

protected:
   
   QWidget         *_centerWidget;
   QTreeView*   _directoryTree;
   QDirModel*   _model;

};

#endif 
Datei Test.cpp:

Code: Alles auswählen

#include <qdirmodel.h>
#include <qtreeview.h>
#include <qlayout.h>

#include "Test.h"

Test::Test( QWidget * parent, Qt::WFlags flags ) : QMainWindow( parent, flags )
{
	resize( QSize( 200, 200 ). expandedTo( minimumSizeHint() ) );

	_centerWidget = new QWidget( this );
	_centerWidget->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
	_centerWidget->setLayout( new QHBoxLayout() );

	setCentralWidget( _centerWidget );
	
	_model = new QDirModel;	
	
	_directoryTree = new QTreeView( _centerWidget );
	_directoryTree->setModel( _model );
	_directoryTree->setContextMenuPolicy(Qt::CustomContextMenu);

	_directoryTree->setColumnHidden( 1, true );	
	_directoryTree->setColumnHidden( 2, true );	
	_directoryTree->setColumnHidden( 3, true );	

	_directoryTree->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn );

	_directoryTree->scrollTo( _model->index( QDir::currentPath() ) );

	_centerWidget->layout()->addWidget( _directoryTree );
}

Ich habe ja die Vermutung, dass es ein Bug in Qt ist und deswegen auch schon auf das neueste Qt 4.11 geupdatet. Hat aber nichts gebracht.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ist setColumnHidden() neu? Jedenfalls scheint die nicht von Anfang an in Qt4 implementiert gewesen zu sein, sonst hätte ich es wohl genutzt. So mußte ich damals einen anderen Weg gehen, der auch heute noch funktioniert und nicht deine Probleme bereitet. Allerdings hatte meine Variante anfangs die selben Erscheinungen.

myTreeView->header->setSectionHidden(col, true);
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

selbes Problem, aber macman's Idee hat nichts gebracht... noch ne Idee?
Glaube an eine Lösung, nur dann kannst du auch eine finden.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Wieviele Spalten hat denn das Widget? Bei mir werden die letzten Spalten versteckt, d.h. es kommen keine sichtbaren mehr danach. Vielleicht liegt es aber auch am TreeView und der Modelgeschichte. Hier funktioniert es nämlich mit einem TreeWidget.
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

Zwei spalten, die zweite soll verschwinden...
Glaube an eine Lösung, nur dann kannst du auch eine finden.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Also ich kann es mit den Beispielen nicht nachvollziehen. Hast Du ein kleines Beispiel?
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

mein Momentanes Beispiel ist ein 85.000 Zeilen Programm... aber erlich gesagt, ist das eine recht zentrale STelle des Programms... ich schau mal ob ich eine entsprechende Kürzung hinbekomme...
Glaube an eine Lösung, nur dann kannst du auch eine finden.
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

QTreeView mit 1 Spalte kein horizontaler Scrollbalken

Beitrag von medi »

Hallo Marcel,

hast Du eine Lösung für Dein Problem gefunden?
Ich habe das Beispiel dirview neu übersetzt. Da erscheint der Scrollbalken sobald die letzte/vierte Spalte beginnt zu verschwinden.
Mein QTreeView hat nur 1 Spalte und es soll keine Spalte versteckt werden. Der Inhalt der Spalte ist teilweise so breit, dass ich einen horizontalen Scrollbalken brauche.
Laut Doku sollte der Standard auch "QT::ScrollBarAsNeeded" sein. Klappt jedoch leider nicht wie erwartet.
Kennt jemand eine einfache Lösung?

Tschau Annett
Marcel
Beiträge: 6
Registriert: 8. März 2006 00:28

Beitrag von Marcel »

Hallo,

also eine befriedigende Lösung habe ich noch nicht gefunden. Scheint wirklich ein Qt-Bug zu sein. Werde mich damit mal an Trolltech wenden.

Vorerst arbeite ich mich folgendem Workaround:
Da das Problem ja durch Verstecken von Spalten entsteht, tue ich dies nicht mehr, sondern setze deren Grösse mit treeview->header()->resizeSection() auf Null. Leider wird diese Grössenangabe aber nicht wörtlich genommen, ein kleiner Teil bleibt in manchen Zeilen noch sichtbar.
Da sich die Scrollarea eines QTreeView auf den durch die Spalten abgedeckten Bereich erstreckt und die Grösse einer Spalte nicht automatisch nach Bedarf vergrössert wird, tue ich das manuell als Reaktion auf das Signal expanded(), wiederum mit treeview->header()->resizeSection().

Leider verhält sich das Teil aber auch dann nicht wirklich wie gewünscht: sobald man z.B. ein Element anklickt, springt der Scrollbalken wieder an den Anfang...
Alles ziemlich unbefriedigend. :evil:
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Marcel hat geschrieben:Scheint wirklich ein Qt-Bug zu sein. Werde mich damit mal an Trolltech wenden.

Auch die werden dich nach einem Beispiel fragen, sonst heißt es nur 'Kann ich hier nicht nach vollziehen'.
Marcel
Beiträge: 6
Registriert: 8. März 2006 00:28

Beitrag von Marcel »

Der Bug ist seit letzter Woche bei Trolltech bekannt und soll in Qt 4.1.3 behoben werden.

http://www.trolltech.com/developer/task ... &id=106383

BTW: Ein Beispiel habe ich doch im ersten Beitrag angeben. Noch kleiner geht's doch eigentlich nicht.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Stimmt, aber da steht auch ein wichtiger Punkt bei, der hier noch gar nicht erwähnt wurde:
Horizontal scroll bar does not appear in the QTreeView when the QHeaderView is hidden.
Allerdings sehe ich in deinem Beispiel auch nirgends, das die Header versteckt werden. Naja, warten auf 4.1.3, da sollen noch andere wichtige Bugs gefixt werden. Ich versteh allerdings nicht warum das auf 4.1.3 gesetzt wird, obwohl die 4.1.2 noch gar nicht offiziell raus ist.
Jean-Gab
Beiträge: 1
Registriert: 5. Januar 2007 15:19

Beitrag von Jean-Gab »

Hallo,

Ich habe mit Qt 4.2 das selbes Problem genau. Ist dieses Problem fixen werden? Haben die TrollTech Engineers etwas daruber gesagt?

Danke,
Jean-Gab
Antworten