2015-06-08 79 views
0

有一个Qtreeview从字典中填充数据,当在此树形视图上选择更改时,然后一些数据显示在QLabel上。Qt selectionChanged在数据重新加载到qtreeview后停止工作

当字典更新(通过双击其他Qtreeview)我调用函数,最初加载数据到Qtreeview。新数据显示,但selectionChanged不再工作。

我做错了什么?

#!/usr/bin/env python -tt 
# -*- coding: utf-8 -*- 
#from PySide.QtGui import * 
from PyQt5.QtGui import * 
from PyQt5.QtCore import * 
from PyQt5.QtWidgets import * 

import sys 
reload(sys) 
sys.setdefaultencoding('utf8') 

data_for_tree = {"tomato":{"color":"red","ammount":"10", "note":"a note for tomato","price":"0.8"},"banana":{"color":"yellow","ammount":"1", "note":"b note for banana", "price":".6"}, "some fruit":{"color":"unknown","ammount":"100", "note":"some text","price":"2.1"}} 
data_for_receiver = {"1":{"name":"milk","price":"3.2","note":"I love milk"}, "2":{"name":"coca-cola","price":".8","note":"coke forever"}} 

class ProxyModel(QSortFilterProxyModel): 

    def __init__(self, parent=None): 
     super(ProxyModel, self).__init__(parent) 

    def lessThan(self, left, right): 
     leftData = self.sourceModel().data(left) 
     rightData = self.sourceModel().data(right) 
     try: 
      return float(leftData) < float(rightData) 
     except ValueError: 
      return leftData < rightData 

class MainFrame(QWidget): 
    def __init__(self): 
     QWidget.__init__(self) 
     self.infoLable = QLabel() 
     self.MyTreeView = QTreeView() 
     self.MyTreeViewModel = QStandardItemModel() 
     self.MyTreeView.setModel(self.MyTreeViewModel) 
     self.most_used_cat_header = ['Name', "ammount", "color"] 
     self.MyTreeViewModel.setHorizontalHeaderLabels(self.most_used_cat_header) 
     self.MyTreeView.setSortingEnabled(True) 
     self.MyTreeView_Fill() 
     self.receiver_tree = QTreeView() 
     self.receiver_model = QStandardItemModel() 
     self.receiver_tree.setModel(self.receiver_model) 
     self.receiver_tree_header = ['#','Name', "price"] 
     self.receiver_model.setHorizontalHeaderLabels(self.receiver_tree_header) 
     self.MyTreeView.doubleClicked.connect(self.addToReceiver) 
     self.receiver_tree.selectionModel().selectionChanged.connect(self.showInfo) 
     self.receiver_fill() 

     MainWindow = QVBoxLayout(self)  
     MainWindow.addWidget(self.infoLable) 
     MainWindow.addWidget(self.MyTreeView) 
     MainWindow.addWidget(self.receiver_tree) 
     self.setLayout(MainWindow) 
    def showInfo(self): 
     indexes = self.receiver_tree.selectedIndexes() 
     index_list =[i.data() for i in  self.receiver_tree.selectedIndexes()] 
     name = index_list[1] 
     price = index_list[2] 
     txt = str(name) + " " + str(price) 
     self.infoLable.setText(txt) 
    def addToReceiver(self): 
     indexes = self.MyTreeView.selectedIndexes() 
     index_list =[i.data() for i in  self.MyTreeView.selectedIndexes()] 
     last_id = max(int(i) for i in data_for_receiver) 
     for k in data_for_tree: 
      v = data_for_tree[k] 
      if [k,v["ammount"],v["color"]] == index_list: 
       i =QStandardItem(str(last_id+1)) 
       name = QStandardItem(k) 
       price = QStandardItem(format(float(v["price"]), ".2f")) 
       tooltip = v["note"] 
       name.setToolTip(tooltip) 
       item = (i, name, price) 
       #self.receiver_model.appendRow(item) 
       upd = {"name":k,"price":v["price"],"note":v["note"]} 
       data_for_receiver[str(last_id+1)] = upd 
       self.receiver_model = QStandardItemModel() 
       self.receiver_tree.setModel(self.receiver_model) 
       self.receiver_fill() 

    def MyTreeView_Fill(self): 
     for k in data_for_tree: 
      name = QStandardItem(k) 
      ammount = QStandardItem(data_for_tree[k]["ammount"]) 
      note = QStandardItem(data_for_tree[k]["color"]) 
      name.setEditable(False) 
      tooltip = "price "+format(float(data_for_tree[k]["price"]), ".2f")+"<br>" 
      tooltip += data_for_tree[k]["note"] 
      item = (name, ammount, note) 
      name.setToolTip(tooltip) 
      self.MyTreeViewModel.appendRow(item) 
     self.MyTreeView.sortByColumn(1, Qt.DescendingOrder) 
     proxyModel = ProxyModel(self) 
     proxyModel.setSourceModel(self.MyTreeViewModel) 
     self.MyTreeView.setModel(proxyModel) 
     c = 0 
     while c < len(self.most_used_cat_header): 
      self.MyTreeView.resizeColumnToContents(c) 
      c=c+1 

    def receiver_fill(self): 
     for k in data_for_receiver: 
      v = data_for_receiver[k] 
      i = QStandardItem(k) 
      name = QStandardItem(v["name"]) 
      price = QStandardItem(format(float(v["price"]), ".2f")) 
      tooltip = v["note"] 
      name.setToolTip(tooltip) 
      item = (i,name, price) 
      self.receiver_model.appendRow(item) 
     c = 0 
     while c < len(self.receiver_tree_header): 
      self.receiver_tree.resizeColumnToContents(c) 
      c=c+1 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    main = MainFrame() 
    main.show() 
    main.move(app.desktop().screen().rect().center() -  main.rect().center()) 
    sys.exit(app.exec_()) 

回答

0

的原因是您创建和addToReceiver设置新QStandardItemModel各一次。方法文档说它会导致视图重新创建选择模型,并且信号连接会丢失。您应该使用self.receiver_model.clear(),并删除setModel呼叫。

+0

非常感谢!我花了很多时间来解决它。谢谢! –

相关问题