crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Получение порядкового номера QTreeView, с родителем и без
poluna
  опции профиля:
сообщение 16.12.2015, 12:36
Сообщение #11


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.10.2015
Пользователь №: 4458

Спасибо сказали: 1 раз(а)




Репутация:   0  


Теперь я поняла тебя. :)
Вариант неплох, и вроде как даже проще в реализации.

Всё, вопрос пока снимаю. Знаю как реализовывать! :yahoo:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 16.12.2015, 12:44
Сообщение #12


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
"внемодельное" дерево

Ойойой, не слушайте его, он вас плохому научит! :lol:
По идее модель в комбобоксе и модель в дереве слева - это должна быть одна и та же модель.
Поэтому индекс от одного должен подходить к индексу от другого.

Т.е. вы сначала получаете выделенный индекс от дерева
(назовем его idx)

потом в комбобоксе делаете
combo->setRootModelIndex(idx.parent())
combo->setCurrentIndex(idx.row())

http://doc.qt.io/qt-4.8/qcombobox.html#setRootModelIndex
http://doc.qt.io/qt-4.8/qcombobox.html#currentIndex-prop
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.12.2015, 13:00
Сообщение #13


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


lanz, да можно и в модели хранить, но я так не люблю делать, это же неудобно ))

lanz, оно, вообще говоря, так и происходит - противоречий нету, но некоторые операции по своему контейнеру удобнее производить

А в данном случае твой вариант лучше будет, конечно )

Сообщение отредактировал Алексей1153 - 16.12.2015, 13:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.12.2015, 13:27
Сообщение #14


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


А по моему Алексей1153 предложил хороший способ, я сам подобным же пользуюсь.
Есть список (QList) или дерево(QMap), которое откуда-то загружается и которое отображается в модели. Очень удобно добавлять, редактировать, удалять. А модель это же абстракция и она не должна по идее хранить данные, как и вид. :)

lanz, выше сказано
Цитата(poluna @ 15.12.2015, 17:11) *
Есть у меня класс TreeComboBox, как можно понять из названия в QComboBox у меня находится QTreeView.
и как я понимаю твой метод идеально подходит для QComboBox, но не для переопределенного класса. Дождемся автора, что она скажет!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
poluna
  опции профиля:
сообщение 16.12.2015, 13:34
Сообщение #15


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.10.2015
Пользователь №: 4458

Спасибо сказали: 1 раз(а)




Репутация:   0  


lanz, если в комбобоксе стандартными средствами можно показать дерево, то твой метод подойдет, но я не смогла.
Как я поняла для показа дерева в комбобокс нужно переопределять класс, я сделала так:
#! /usr/bin/python
# -*- coding: UTF-8 -*-

from PyQt4 import QtCore, QtGui


class TreeComboBox(QtGui.QComboBox):
    def __init__(self, parent=None):
        super(QtGui.QComboBox, self).__init__(parent)
        self._skipNextHide = False
        self._treeView = QtGui.QTreeView(self)
        self.setView(self._treeView)
        self._treeView.header().hide()
        self._treeView.viewport().installEventFilter(self)

    def eventFilter( self, object, event):
        if event.type() == QtCore.QEvent.MouseButtonPress and object == self.view().viewport():
            index = self.view().indexAt(event.pos())
            if not self.view().visualRect(index).contains(event.pos()):
                self._skipNextHide = True
        return False

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

    def hidePopup(self):
        self.setRootModelIndex(self.view().currentIndex().parent())
        self.setCurrentIndex(self.view().currentIndex().row())
        if self._skipNextHide:
            self._skipNextHide = False
        else:
            QtGui.QComboBox.hidePopup(self)
если я не права, то буду только рада, сразу куча проблем исчезнет! :)
Но пока не знаю как!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 16.12.2015, 14:53
Сообщение #16


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


poluna, ну у меня ваш код вроде работает как надо, ЧЯДНТ? :lol:
Немножко поменял hidePopup, чтобы он сразу все не корячил:
    def hidePopup(self):
        if self._skipNextHide:
            self._skipNextHide = False
        else:
            self.setRootModelIndex(self.view().currentIndex().parent())
            self.setCurrentIndex(self.view().currentIndex().row())
            QtGui.QComboBox.hidePopup(self)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
poluna
  опции профиля:
сообщение 16.12.2015, 16:06
Сообщение #17


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.10.2015
Пользователь №: 4458

Спасибо сказали: 1 раз(а)




Репутация:   0  


Все, поняла, все работает! :)

Выкладываю работающий пример, так же на python:
пример
#! /usr/bin/python
# -*- coding: UTF-8 -*-

import sys
from PyQt4 import QtCore, QtGui

class TreeComboBox(QtGui.QComboBox):
    def __init__(self, parent=None):
        super(QtGui.QComboBox, self).__init__(parent)
        self._skipNextHide = False
        self._treeView = QtGui.QTreeView(self)
        self.setView(self._treeView)
        self._treeView.header().hide()
        self._treeView.viewport().installEventFilter(self)

    def eventFilter( self, object, event):
        if event.type() == QtCore.QEvent.MouseButtonPress and object == self.view().viewport():
            index = self.view().indexAt(event.pos())
            if not self.view().visualRect(index).contains(event.pos()):
                self._skipNextHide = True
        return False

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

    def hidePopup(self):
        if self._skipNextHide:
            self._skipNextHide = False
        else:
            self.setRootModelIndex(self.view().currentIndex().parent())
            self.setCurrentIndex(self.view().currentIndex().row())
            QtGui.QComboBox.hidePopup(self)

class Main(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self._comboBox = TreeComboBox(self)
        self._treeView = QtGui.QTreeView(self)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(self._comboBox)
        layout.addWidget(self._treeView)
        self.setLayout(layout)

        model = QtGui.QStandardItemModel()
        for a in range(3):
            i = QtGui.QStandardItem('Item ' + str(a))
            for b in range(3):
                ii = QtGui.QStandardItem('sub 1 Item ' + str(b))
                i.setChild(b, ii)
                for c in range(3):
                    iii = QtGui.QStandardItem('sub 2 Item ' + str(c))
                    ii.setChild(c, iii)
            model.appendRow(i)

        self._comboBox.setModel(model)
        self._treeView.setModel(model)

        self.connect(self._treeView, QtCore.SIGNAL("clicked(const QModelIndex&)"), self.comboSelect)

    def comboSelect(self, idx):
        self._comboBox.setRootModelIndex(idx.parent())
        self._comboBox.setCurrentIndex(idx.row())

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    main = Main()
    main.show()

    sys.exit(app.exec_())


lanz, спасибо огромное! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2024, 4:14