crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> соеденение древа и таблици, помогите пожайлусто
Lunt
  опции профиля:
сообщение 11.5.2012, 16:16
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 11.5.2012
Пользователь №: 3373

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




Репутация:   0  


народ помогите, совсем сил нету...
я написал прогу, в ней слева древо классов справа таблица, мне надо сделать так чтобы при нажатии мышкой на элемент в древе, в таблице появился этот элемент...
заранее спасибо

вот код проги:
# -*- coding: cp1251 -*-
'''
Created on 27.10.2011

@author: ALEX
'''

import sys
from PyQt4 import QtGui, QtCore


class drevo(QtGui.QMainWindow):
    def __init__ (self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.move(300, 300)
        tree = QtGui.QTreeWidget(self)
#        self.setCentralWidget(tree)
        self.cw = QtGui.QWidget(self)
        QtGui.QHBoxLayout(self.cw)
        self.setCentralWidget(self.cw)
#        self.setCentralWidget(QtGui.QWidget())
        self.centralWidget().layout().addWidget(tree)
        tree.setColumnCount(2)
        #заголовки 1 и 2 столбцов
        tree.headerItem().setData(0, QtCore.Qt.DisplayRole, QtCore.QVariant(u'1'))
        tree.headerItem().setData(1, QtCore.Qt.DisplayRole, QtCore.QVariant(u'2'))
        # заполнение дерева данными, верхний уровень:
        item = self.createItem(u'переславль', 'sity')
        tree.addTopLevelItem(item)
        item2 = self.createItem(u'ярославль', 'sity')
        tree.addTopLevelItem(item2)
        # заполнение дерева данными, второй уровень:
        item.addChild(self.createItem(u'1152', 'osnovan'))
        item2.addChild(self.createItem(u'основан 1221', ''))
        # заполнение дерева данными, третий уровень:
        item.child(0).addChild(self.createItem(u'долгорукий', 'kto osnoval'))
        item2.child(0).addChild(self.createItem(u'хw3з', ''))
        
#        self.mw = QtGui.QMainWindow() # создаем главное окно
#        self.mw.setWindowTitle('qwe') # ставим заголовок
#        self.mw.setCentralWidget(QtGui.QWidget()) # ставим "центральный виджет"
#        self.mw.centralWidget().setLayout(QtGui.QHBoxLayout()) # обращаемся к центральному виджету и задаем ему лэйаут
        self.qwq = QtGui.QTableWidget() # создаем табличный виджет
        self.centralWidget().layout().addWidget(self.qwq) # выложили виджет
        self.qwq.setRowCount(1) # задали кол-во строк
        self.qwq.setColumnCount(1) # столбцов
        #self.qwq.setColumnHidden(0,True) # спрятали первую колонку
        self.show() # показываем окно
        
        
        
        b = QtGui.QPushButton('klick') # создали кнопку
        self.centralWidget().layout().addWidget(B) # обращаемся к лэйауту виджета - добавляем виджет - нашу кнопку
        QtCore.QObject.connect(b,QtCore.SIGNAL('clicked()'),self.klick) # соединяем сигнал "clicked()" с методом klick
        
    def klick(self):
        try: # обработка исключений
            print self.text() # берем text() из элемента грида 1,1 и печатаем его
        except: # в случае всех ошибок
            print 'Не создан элемент' # ругаемся
        #показывание что на писано в 1 и 2 столбцах
    def createItem(self, first, second):
        item = QtGui.QTreeWidgetItem()
        item.setData(0, QtCore.Qt.DisplayRole, QtCore.QVariant(first))
        item.setData(1, QtCore.Qt.DisplayRole, QtCore.QVariant(second))
        return item
        
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    win = drevo()
    win.show()
    sys.exit(app.exec_())
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 11.5.2012, 17:41
Сообщение #2





Гости








    


Разбираться в твоих каракулях, да ещё и без нормального редактирования лень, но здесь есть 2 статьи про то как можно разбивать/объединять модели, получая более удобное представление, с помощью прокси моделей. На мой взгляд это самый правильный и реюзабельный способ из тех что я видел. Бонус использования в том, что например получение под таблицы из дерева, можно заимплементить 1 раз, и так что в любой ситуации когда понадобится подобный функционал, можно просто использовать уже готовую прокси модель, да и кода написать придется если не меньше, то точно уж не больше чем в том варианте который ты хочешь реализовать, а производительность решения потенциально выше, т.к. копирования данных в данной ситуации ты избегаешь.
Ну это всё верно конечно, если в PyQt можно создать наследника QAbstractProxyModel, хотя при большом желании наверняка можно сделать наследника на c++ и дальше уже использовать из Python кода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lunt
  опции профиля:
сообщение 11.5.2012, 18:59
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 11.5.2012
Пользователь №: 3373

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




Репутация:   0  


# -*- coding: cp1251 -*-
'''
Created on 27.10.2011

@author: ALEX
'''

import sys
from PyQt4 import QtGui, QtCore


class drevo(QtGui.QMainWindow):
    def __init__ (self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.move(300, 300)
        tree = QtGui.QTreeWidget(self)
        self.cw = QtGui.QWidget(self)
        QtGui.QHBoxLayout(self.cw)
        self.setCentralWidget(self.cw)
        self.centralWidget().layout().addWidget(tree)
        tree.setColumnCount(2)

тут я создал древо
#заголовки 1 и 2 столбцов
        tree.headerItem().setData(0, QtCore.Qt.DisplayRole, QtCore.QVariant(u'1'))
        tree.headerItem().setData(1, QtCore.Qt.DisplayRole, QtCore.QVariant(u'2'))
# заполнение дерева данными, верхний уровень:
        item = self.createItem(u'переславль', 'sity')
        tree.addTopLevelItem(item)
        item2 = self.createItem(u'ярославль', 'sity')
        tree.addTopLevelItem(item2)
# заполнение дерева данными, второй уровень:
        item.addChild(self.createItem(u'1152', 'osnovan'))
        item2.addChild(self.createItem(u'основан 1221', ''))
# заполнение дерева данными, третий уровень:
        item.child(0).addChild(self.createItem(u'долгорукий', 'kto osnoval'))
        item2.child(0).addChild(self.createItem(u'хw3з', ''))
        


тут я создал таблицу
        self.qwq = QtGui.QTableWidget()                           # создаем табличный виджет
        self.centralWidget().layout().addWidget(self.qwq) # выложили виджет
        self.qwq.setRowCount(1)                                       # задали кол-во строк
        self.qwq.setColumnCount(1)                                  # столбцов
        #self.qwq.setColumnHidden(0,True)                      # спрятали первую колонку
        self.show()                                                             # показываем окно

тут надо написать метод connect только я хз как... как я понял надо то место куда ты ткнеш мышкой в древе, чтоб автоматически отобразилось в таблице... например ткнул на ярославль - отобразился ярославль

    def createItem(self, first, second):
        item = QtGui.QTreeWidgetItem()
        item.setData(0, QtCore.Qt.DisplayRole, QtCore.QVariant(first))
        item.setData(1, QtCore.Qt.DisplayRole, QtCore.QVariant(second))
        return item
        
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    win = drevo()
    win.show()
    sys.exit(app.exec_())
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 11.5.2012, 21:40
Сообщение #4





Гости








    


Так то тег code есть, да и вряд ли вся программа нужна, скорее всего не корректно работает та функция которая отвечает за выгрузку части данных из одной модели и загрузку в другую.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 11.5.2012, 21:51
Сообщение #5





Гости








    


А ну в принципе мои телепатические способности похоже под вечер возвросли, тебе нужно получить у QTreView'a его selection model, a дальше уже смотреть какой из её сигналов тебе будет удобней обрабатывать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 14.5.2012, 10:30
Сообщение #6


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

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

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




Репутация:   40  


М
Lunt, учимся пользоваться тегом CODE!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги


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




RSS Текстовая версия Сейчас: 5.6.2020, 13:35