Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: mugabe от Май 12, 2009, 06:58



Название: QComboBox + QTreeView
Отправлено: mugabe от Май 12, 2009, 06:58
Пытаюсь сделать комбобокс с деревом. После первого наступания на грабли решил поискать в интернетах, и нашел такую реализацию:
Код
C++ (Qt)
class TreeComboBox : public QComboBox
{
public:
   TreeComboBox(QWidget* parent = 0) : QComboBox(parent), skipNextHide(false)
   {
       QTreeView* v = new QTreeView(this);
       setView(v);
       v->header()->hide();
       v->viewport()->installEventFilter(this);
   }
 
   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(QModelIndex());
       QComboBox::showPopup();
   }
 
   virtual void hidePopup()
   {
       setRootModelIndex(view()->currentIndex().parent());
       setCurrentIndex(view()->currentIndex().row());
 
       if (skipNextHide)
           skipNextHide = false;
       else
           QComboBox::hidePopup();
   }
 
private:
   bool skipNextHide;
};
 

Но здесь тоже оказались грабли. При выборе элемента из дерева выбирается совсем не то, что хотелось.
Если убрать первые две строчки из hidePopup() то все более менее нормализуется, но только если комбобокс нередактируемый. Стоит сделать setEditable(true) поведение становится совершенно другим.

Других реализаций пока не нашел.

Может быть кто-то делал подобное уже? Поделитесь решением.


Название: Re: QComboBox + QTreeView
Отправлено: miha-ha от Август 07, 2009, 08:00
Проблема актуальна!!!
Никто не сталкивался?

Необходимо и размер viewPort изменять при разворачивании ветки.