Implementing QTreeView in QComboBox using Qt- Part 2
Article Metadata
Tested with
Devices(s): S60 Emulator
Compatibility
Platform(s): Qt
Article
Keywords: QComboBox,QTreeView,QDirModel
Created: mind_freak
(31 Jul 2009)
Last edited: hamishwillee
(11 Oct 2012)
Contents |
Introduction
This code demonstrates the QTreeView implemented in QComboBox. Here you can expand the tree view and also select the file you want, no restriction of QComboBox closing on one click, you can select items upto any level.
Name of classed used:
QTreeView-Provides a default model/view implementation of a tree view.
QDirModel-Provides a data model for the local file system.
Source Code
#include <QtGui/QApplication>
#include "widget.h"
#include<QComboBox>
#include<QDirModel>
#include<QTreeView>
#include<QEvent>
#include<QMouseEvent>
#include<QModelIndex>
#include<QDir>
class TreeBox : public QComboBox
{
public:
TreeBox(QWidget* parent = 0) : QComboBox(parent), skipNextHide(false) //Widget creation
{
setView(new QTreeView(this));
view()->viewport()->installEventFilter(this);
QComboBox::resize(200,30);
}
bool eventFilter(QObject* object, QEvent* event)
{
if (event->type() == QEvent::MouseButtonPress && object == view()->viewport())
{
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
QModelIndex index = view()->indexAt(mouseEvent->pos());
if (!view()->visualRect(index).contains(mouseEvent->pos()))
skipNextHide = true;
}
return false;
}
virtual void showPopup()
{
setRootModelIndex(static_cast<QDirModel*>(model())->index(QDir::rootPath()));
QComboBox::showPopup();
}
virtual void hidePopup()
{
setRootModelIndex(view()->currentIndex().parent());
setCurrentIndex(view()->currentIndex().row());
if (skipNextHide)
skipNextHide = false;
else
QComboBox::hidePopup();
}
private:
bool skipNextHide;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TreeBox combo; //Class object declaration
QDirModel model;
combo.setModel(&model); //implemention QDir model
combo.show();
return a.exec();
}


Article Provides a default model/view implementation of a tree view. It’s a good thing when we want to create an application which contain of all data storage view. In many application like file manager, Bluetooth file transfer this view is needed. Article named with “Implementing QTreeView_in_QComboBox-I” is also the 70% same thing. Its an advance look of that article.
[--fasttrack 18:13, 16 September 2009 (UTC)]