Seite 1 von 1

Problem mit horizontaler Scrollbar von QTreeView

Verfasst: 8. März 2006 02:20
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.

Verfasst: 8. März 2006 07:15
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);

Verfasst: 8. März 2006 12:43
von Esleborn
selbes Problem, aber macman's Idee hat nichts gebracht... noch ne Idee?

Verfasst: 8. März 2006 12:54
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.

Verfasst: 8. März 2006 14:55
von Esleborn
Zwei spalten, die zweite soll verschwinden...

Verfasst: 8. März 2006 15:29
von macman
Also ich kann es mit den Beispielen nicht nachvollziehen. Hast Du ein kleines Beispiel?

Verfasst: 9. März 2006 00:48
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...

QTreeView mit 1 Spalte kein horizontaler Scrollbalken

Verfasst: 14. März 2006 11:45
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

Verfasst: 15. März 2006 12:49
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:

Verfasst: 15. März 2006 12:54
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'.

Verfasst: 15. März 2006 13:59
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.

Verfasst: 15. März 2006 14:13
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.

Verfasst: 5. Januar 2007 15:24
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