Russian Qt Forum
Ноябрь 01, 2024, 02:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt 4.2.3 Дерево в комбобоксе  (Прочитано 19584 раз)
Tonal
Гость
« : Июнь 19, 2007, 10:16 »

Может кто такое уже делал?
Вроде ничего сложного:
  • создаёшь QTreeView,
  • устанавливаешь ему модель,
  • устанавливаешь его в качестве view в комбике,
  • устанавливаешь комбику ту же модель.

Оно даже показывается.
Но при выборе любого элемента дерева currentIndex не меняется, и при открытии снова в дереве не установлен текущий элемент...

Как побороть?
Записан
SABROG
Гость
« Ответ #1 : Июнь 19, 2007, 10:52 »

Т.е. он каждый раз заново его создает ?
Записан
Tonal
Гость
« Ответ #2 : Июнь 19, 2007, 12:09 »

Нет, с чего бы это.
Просто он, похоже не умеет корректно обрабатывать выбор в дереве.
Или я его не умею об этом правильно попросить. ;-\
Записан
SABROG
Гость
« Ответ #3 : Июнь 20, 2007, 08:37 »

А выбранный элемент не появляется в поле комбика после того как список закрылся ?
Записан
Tonal
Гость
« Ответ #4 : Июнь 20, 2007, 08:47 »

Там вообще какая-то лажа...
Тестировалось на дереве с одним корнем.
Так вот, если выбрать итем из первой ветки - пишется корень
Если из какой другой - пусто.

P.S. Понятно, что в исходники надо лезть и разбираться. Но пока времени нет... ;-(
Записан
Tonal
Гость
« Ответ #5 : Июнь 26, 2007, 10:01 »

Разобрался.
Если кратко, надо переопределить showPopup и hidePopup у QComboBox-а

Если кому интересно, могу кинуть сюда код на python-е - аж ~60 строк. ;-)
Записан
Gryz
Гость
« Ответ #6 : Июнь 26, 2007, 13:44 »

Кидай, что вышло. В будущем может пригодиться. Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Июнь 26, 2007, 13:58 »

Мы на конторе тоже делали подобную дрянь... тока комбо сами отрисовывали, ну и своего управления подобавляли. Там проблема в сохранении индекса элемента дерева была - надо было всегда сохранять индекс для 0-й колонки, а по умолчанию возвращался индекс итема для той колонки, где он был выбран...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Tonal
Гость
« Ответ #8 : Июнь 26, 2007, 14:04 »

Код:

from PyQt4 import QtCore, QtGui

class WidgetComboBoxTree(QtGui.QTreeView):

  def __init__(self, parent=None):
    QtGui.QTreeView.__init__(self, parent)
    self.setUniformRowHeights(True)
    self.setRootIsDecorated(True)
    self.setItemsExpandable(True)
    self.setSortingEnabled(True)
    self.setSelectionBehavior(QtGui.QTreeView.SelectRows)
    self.header().setVisible(False)
    self.setMinimumHeight(150)

class WidgetTreeCombo(QtGui.QComboBox):
  __curItem = None
  __tree = None

  def __init__(self, parent=None):
    QtGui.QComboBox.__init__(self)
    self.__tree = WidgetComboBoxTree()
    self.setView(self.__tree)

  def hidePopup(self):
    self.__setCurModInd(self.view().currentIndex())
    return QtGui.QComboBox.hidePopup(self)

  def showPopup(self):
    QtGui.QComboBox.showPopup(self)
    self.setRootModelIndex(QtCore.QModelIndex())
    self.__tree.expandAll()

  def currentModelIndex(self):
    return self.__curItem

  def setModel(self, model, sortOrder=QtCore.Qt.AscendingOrder):
    if sortOrder in (QtCore.Qt.AscendingOrder, QtCore.Qt.DescendingOrder):
      self.__tree.header().setSortIndicator(0, sortOrder)
    QtGui.QComboBox.setModel(self, model)

  def setCurrentModelIndex(self, modelIndex):
    self.__setCurModInd(modelIndex)
    self.setCurrentIndex(modelIndex.isValid() and modelIndex.row() or 0)

  def tree(self):
    return self.__tree

  def __setCurModInd(self, idx):
    if idx and idx.isValid:
      self.__curItem = QtCore.QPersistentModelIndex(idx)
      self.setRootModelIndex(self.__curItem.parent())
    else:
      self.__curItem = None
      self.setRootModelIndex(QtCore.QModelIndex())

Несколько замечаний:
1) Здесь предполагается, что хотя бы один элемент в дереве да есть.
2) Честно расчитывать размер мне пока лень. ;-)
3) Цвет дерева в Cleanlooks-е почему-то не такой как у обычного списка для не редактируемого комбобокса.
4) При попытке свернуть/развернуть ветку, её корень выбирается и список закрывается.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #9 : Июнь 26, 2007, 22:09 »

блин, что за мракобесие этот питон...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Tonal
Гость
« Ответ #10 : Июнь 27, 2007, 08:21 »

А что не нравиться-то?
Как было, так и запостил.
Перепиши на плюсы - тут практически 1в1 можно сделать. Кода только чуть больше получиться ;-)

P.S. Я люблю плюсы, и довольно хорошо их знаю, но, к сожалению, по скорости разработки и простоте поддержки python-у они сливают ощутимо.
P.P.S. Python я тоже люблю и б/м знаю. ;-)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #11 : Июнь 27, 2007, 08:52 »

да синтаксис у него какой то уезженный... такое чувство, что на бейсик перешел... А по скорости разработки и простоте что плюсы уступают - я не соглашусь.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Tonal
Гость
« Ответ #12 : Июнь 27, 2007, 16:45 »

Ну синтаксис - это кому что нравиться. Меня вот с басика корячит, а в MS его очень любят. ;-)

А про скорость разработки и простоте - это реально так...
Достигается многими факторами: простота языка, базовые структуры данных, объектные и функциональные возможности, сборка мусора, богатство стандартной библиотеки, стак-трейс, и т.д.

Я как-то здесь более подробно всё расписывал.

У нас раньше разработка велась в основном на Delphi и CBuilder-е.
Он из за бардака в borland-е мы постоянно искали альтернативы.
А тут заказик подошел - сделать прогу - помошник переводчика одной очень специализированной базы данных.
Базка - 100м в dbf-ах с иерархической структурой.
Заказик небольшой и не критичный.
Решили посмотреть, как это на Qt получиться.
Набросали прототип на Python + Qt, чтоб потом, как юзабилити и функциональность утрясётся, на плюсы переписать, чтоб не тормозило...
Переписывать не пришлось - скорость работы заказчика полностью удовлетворила! ;-)

Сейчас у нас получается, что скорость разработки примерно в двое выше чем была до того.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #13 : Июнь 27, 2007, 20:41 »

Delphi и CBuilder - отстой редкий... особенно последнее...
Питон же мне васика напоминает всем, а именно производительность, а не скорость разработки играет решающую роль, по крайней мере у нас.
Тут уж лучше плюсов может быть только асм Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Tonal
Гость
« Ответ #14 : Июнь 27, 2007, 21:46 »

Цитата: "Racheengel"
Delphi и CBuilder - отстой редкий... особенно последнее...

Полностью согласен. Написал им более 10 багрепортов... А в ответ - тишина...
Но хотелось бы какой-нибудь конкрктный пример "отстоя", на плюсах желательно, строк на 3-5, чтобы убедиться что ты в курсе того о чём говоришь.
Цитата: "Racheengel"
Питон же мне васика напоминает всем

На вкус и цвет... А много ли ты писал на том или другом?
Вобще на чём кроме плюсов? ;-)
Цитата: "Racheengel"
, а именно производительность, а не скорость разработки играет решающую роль, по крайней мере у нас.
Тут уж лучше плюсов может быть только асм Улыбающийся

Это всяко от задачи зависит.
На совсем вычислительных задачах до сих пор Fortran рулит вроде как. ;-)
Ну а если, например, клиентский гуй рисовать, так по любому тормоза основные на сервере да на сетке будит. Так что примерно пофиг скорость выполнения языка. Хотя, если нет привычки голову включать, то и на плюсах всё будет тормозить. ;-)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.088 секунд. Запросов: 23.