Название: QComboBox и его view Отправлено: Whiplash от Ноябрь 15, 2010, 17:50 Здравствуйте. Помогите, пожалуйста, решить такую интерфейсную проблему. Или хотя бы подскажите, с какой стороны к ней подобраться.
В общем, в программах использую стиль Cleanlooks - больше всего нравится визуально. Просто жёстко в конструкторе устанавливаю и всё, но не в этом суть. Стиль всем хорош, кроме поведения выпадающего view у комбобокса - там не показывается полос прокрутки, а вместо них - довольно неудобные области прокрутки сверху и снизу. И, кроме того, если контента много, то этот view вываливается на весь экран. Если не очень понятно - попробуйте у себя этот стиль. Более-менее сносное поведение выпадающего виджета в стиле Plastique. Подскажите пжалста: 1. Как трансплантировать поведение (не визуальное оформление) виджета из одного стиля в другой? 2. Как по правильному изменить поведение выпадающего виджета? Хотелось бы нормальную полосу прокрутки справа, и самое сладкое - это добавить возможность мышкой раздвигать выпадающий виджет. Сам я со стилями практически не работал, не знаю, куда копнуть по-быстрому. Название: Re: QComboBox и его view Отправлено: GreatSnake от Ноябрь 15, 2010, 18:36 QSizeGrip
QListView void QComboBox::setView ( QAbstractItemView * itemView ) virtual void QComboBox::showPopup() Название: Re: QComboBox и его view Отправлено: Whiplash от Ноябрь 16, 2010, 09:23 В качестве view я и так использую нестандартный для комбобокса - подключил QTreeWidget. Он руками не ресайзится - поведение точно такое же, как и у стандартного view. Попробую QSizeGrip (правда, написано, что он только для top-level окон).
Название: Re: QComboBox и его view Отправлено: GreatSnake от Ноябрь 16, 2010, 11:59 Если ваша прикладина будет работать под Х-ами, то хочу вас огорчить.
QSizeGrip не будет ресайзить drop-down list :( Тролли под Х-ами задействуют NET_WM_MOVERESIZE, который не работает с окнами типа Qt:: Pоpup. Они даже до сих пор не удосужились исправить QTBUG-11447 (http://bugreports.qt.nokia.com/browse/QTBUG-11447). Единственное решение - переопределить QSizeGrip::mousePress(), QSizeGrip::mouseMove(), QSizeGrip::mouseRelease() и самому делать ресайз popup-окна. Название: Re: QComboBox и его view Отправлено: Whiplash от Ноябрь 16, 2010, 12:19 Я делаю под винду пока, но фиг знает - может, когда и придётся будет запускать под иксы. Но так-то и фиг с ним, с QSizeGrip.
Так вроде более-менее разобрался. Чтобы скроллбар появился, нужно его создать :) И созджать после того, как комбобоксу присвоен view. Сейчас встал вопрос - как сделать так, чтобы исчезли эти прокручивающие фиговины вверху и внизу списка (я раньше думал, что это какой-то спец скроллбар, а оказалось - что нет). В стиле Cleanlooks view у комбобокса распахивается в обе стороны так, что текущий элемент оказывается под мышкой. Это не очень удобно, но с этим можно смириться. Но самое интересное, что я обнаружил: в стиле Plastique в выпадающем TreeView неэкспандятся/коллапсятся элементы! Правда, только после второго показа :) Т.е. запускаем приложение, раскрываем комбобокс - там тривью - работает замечательно. Выбираем элемент, снова раскрываем комбобокс - всё, дерево мёртвое, нелья ничего ни раскрыть, ни свернуть. В cleanlooks и стандартном виндовом всё нормально. вообще чудеса какие-то. Кстати, долго пытался победить ненормальное поведение выпадающего дерева: при нажатии на +/- выбирается этот элемент и дерево исчезает. Сначала боролся с помощью eventFilter - нифига не работало (это решение на форуме нашёл). Потом сделал следующим образом: В конструкторе: Код: QObject::connect(tw, SIGNAL(itemExpanded(QTreeWidgetItem*)),this, SLOT(skipHide())); И переопределённый hidePopup: Код: void TreeComboBox::hidePopup() Название: Re: QComboBox и его view Отправлено: GreatSnake от Ноябрь 16, 2010, 12:26 Чтобы избавиться от скроллеров переопредели QCleanlooksStyle::styleHint()
и если hint==QStyle::SH_ComboBox_Popup возвращай 0. Название: Re: QComboBox и его view Отправлено: Whiplash от Ноябрь 16, 2010, 14:56 Спасибо, попробую.
UPD: да, действительно работает. Сначала мучался, пытаясь сохранить геометрию попапа (ну сохранить-то непроблема - восстановить не получилось). Потом забил - всё равно на X-ах не заработает. Название: Re: QComboBox и его view Отправлено: Whiplash от Ноябрь 16, 2010, 17:23 Всё, последнюю непонятку решил. Если вдруг кто-нибудь задумает в качестве попапа у комбобокса поставить дерево, то у него неполучится тривиально установить текущий элемент в комбобоксе (из программы, имеется в виду). Т.к. у него есть только setCurrentIndex(int). Хотя, логично было бы для виджета, что поддерживает MVC, иметь метод setCurrentIndex(QModelIndex).
Так вот, что бы всё-таки установить нужный текущий элемент придётся изобразить примерно следующее. Код: tw->setCurrentItem(item); Я использую QTreeWidget, в item - нужный элемент дерева. И переопределить метод showPopup(): Код: void TreeComboBox::showPopup() Всё, я почти щаслив :) Название: Re: QComboBox и его view Отправлено: GreatSnake от Ноябрь 16, 2010, 17:27 Дык надо было сразу использовать QTreeView.
Название: Re: QComboBox и его view Отправлено: Whiplash от Ноябрь 16, 2010, 18:07 Дык надо было сразу использовать QTreeView. Да вот не пофигу, чего использовать. QTreeWidget от QTreeView отличается только наличием встроенной модели, что мне собсно и надо было. В конструкторе комбобокса я вот взял и установил модель: Код: setModel(tw->model()); Я думаю, использование treeview в данном случае практически не отличается от treewidget. Название: Re: QComboBox и его view Отправлено: GreatSnake от Ноябрь 16, 2010, 18:24 Я это к тому, что если бы не связывался с QTreeWidget, то использовать setCurrentItem() не пришлось бы и всё сразу заработало.
Как показывает практика местных жителей, кто начинает залезать в дебри Qt, тот не использует Q*Widget. Вполне возможно, что тролли тоже, поэтому для Q*Widget периодически приходится делать всякие workarounds. Название: Re: QComboBox и его view Отправлено: Whiplash от Ноябрь 17, 2010, 09:14 Я это к тому, что если бы не связывался с QTreeWidget, то использовать setCurrentItem() не пришлось бы и всё сразу заработало. Как показывает практика местных жителей, кто начинает залезать в дебри Qt, тот не использует Q*Widget. Вполне возможно, что тролли тоже, поэтому для Q*Widget периодически приходится делать всякие workarounds. Пришлось бы использовать setCurrentIndex :) Я вот сейчас как раз сделаю модель и допишу класс на использование внешней модели. Почти уверен, что комбобокс будет вести себя также. Отпишусь. Название: Re: QComboBox и его view Отправлено: Whiplash от Ноябрь 17, 2010, 10:24 Ну вот, переписал. Благо, модель была уже (всмысле - раньше написана в проекте и используется). Как и предполагалось - ничего не изменилось в поведении комбобокса. Малось дополнил установку текущего индекса в комбобоксе, позволяющую обойтись без переопределения метода showPopup:
Код: setRootModelIndex(tv->currentIndex().parent()); Название: Re: QComboBox и его view Отправлено: GreatSnake от Ноябрь 17, 2010, 10:26 Ну и славненько)
Название: Re: QComboBox и его view Отправлено: picobrain от Ноябрь 17, 2010, 21:10 Гм. Спасибо всем. Тоже интересовался.
Заморачиваться не стал - если у комбобокса предполагалось больше 10-20 элементов, выставлял ему стиль Windows. Название: Re: QComboBox и его view Отправлено: kolob от Декабрь 11, 2012, 00:08 Код: setRootModelIndex(tv->currentIndex().parent()); последняя строка кода для чего? у меня с ней не получается выставления текущего элемента. я делал без представления, а сразу модель установил в QComboBox |