2014-01-13 137 views
3

我在屏幕1上使用QStackedWidget,我有一個QTreeWidget與項目列表和屏幕2有幾個組合框和複選框。雙擊樹窗口小部件中的項目會將我帶到屏幕2.我想要做的是開發一種方法來記住所選設置。PyQt記住UI狀態/項目

因此,例如。如果我在treewidget中雙擊'Item1',在屏幕2中選擇一些選項並返回到屏幕1並選擇'Item2',其中這次我選擇一組不同的組合項目等。再次返回到第一個屏幕並雙擊'Item1',我應該恢復之前與之關聯的選項。

希望這是有道理的。我需要最佳方式來幫助你做到這一點,一些代碼示例會很好。

真的很感謝任何幫助。

+0

您可以發佈您的代碼以獲取建議 –

+0

我的代碼太大而無法粘貼到此處,其中此查詢只是其中的一小部分。爲了展示這篇文章,我將不得不削減它。 ekhumoros回答下面的工作完美,雖然 – floyd1510

回答

4

所有的樹控件項目有setData方法,你可以用它來存儲相關的值,在這種情況下,也只是含有設置的dict

爲了更方便地保存和恢復設置,建議確保所有複選框,組合框等都具有共同的父級,並且它們都被賦予唯一的objectName。這樣一來,就會很容易地在它們之間迭代:

def saveSettings(self): 
     settings = {} 
     for child in self.settingsParent.children(): 
      name = child.objectName() 
      if not name: 
       continue 
      if isinstance(child, QtGui.QCheckBox): 
       settings[name] = child.isChecked() 
      elif isinstance(child, QtGui.QComboBox): 
       settings[name] = child.currentIndex() 
      ... 
     return settings 

    def restoreSettings(self, settings): 
     for child in self.settingsParent.children(): 
      name = child.objectName() 
      if name not in settings: 
       continue 
      if isinstance(child, QtGui.QCheckBox): 
       child.setChecked(settings[name]) 
      elif isinstance(child, QtGui.QComboBox): 
       child.setCurrentIndex(settings[name]) 
      ... 

要設置添加到樹控件項目,您需要做的僅僅是這樣的:

settings = self.saveSettings() 
    item.setData(0, QtCore.Qt.UserRole, settings) 

和檢索他們,這樣做:

settings = item.data(0, QtCore.Qt.UserRole) 
    self.restoreSettings(settings) 

但請注意,你可能需要在這裏採取額外的步驟,如果你正在使用python2,因爲data會返回一個QVariant,而不是dict。如果是這樣的話,拿到dict,你需要做到這一點,而不是:

settings = item.data(0, Qt.QtCore.Qt.UserRole).toPyObject() 

或者,你可以擺脫QVariant無處不在,但是把這個在你的程序的開頭:

import sip 
    sip.setapi('QVariant', 2) 
    from PyQt4 import ... etc 
+0

謝謝,這工作很好 – floyd1510