2009-08-21 113 views
1

我已經得到了下面的代碼,並且我計劃在同一個「import」中創建幾個類。我希望能夠實例化每個類並獲得我正在創建的小部件的返回值。oop實例化pythonic實踐

這是不是一個真正的PyQt的問題可言,更多的是「良好做法」的問題,因爲我要爲每個插件一類。

我應該讓函數返回創建的小部件嗎?如果是這樣的話?我如何確保難以直接實例化類,如果這是我所追求的最佳方法?

我希望能夠做這樣的事情....

tabs = wqTabWidget(['firstTab', 'Second', 'Last Tab']) 

或(這曾經是一個更好的做法)

tabs = wqInstance.createTabs(['firstTab', 'Second', 'Last Tab']) 

這裏是我的類到目前爲止...

from PyQt4 import QtCore as qc 
from PyQt4 import QtGui as qg 

class wqTabWidget(qg.QTabWidget): 
    def __init__(self, *args): 

     apply(qg.QTabWidget.__init__,(self,)) 
     tabList = [] 
     tabNames = args[0] 

     for name in tabNames: 
      tabWidget = qg.QWidget() 
      self.addTab(tabWidget, name) 
      tabList.append({ name:tabWidget }) 

    print 'hi' 


if __name__ == '__main__': 
    app = qg.QApplication(sys.argv) 
    window = wqTabWidget(['hi', 'there', 'and', 'stuff']) 
    window.show() 
    app.exec_() 

回答

4

如果在運行時可以更改選項卡列表,則會決定答案。如果這個小部件實際上只支持添加一組選項卡,但不會更改或追加新選項卡,則選項卡列表應來自初始化程序。否則,你應該添加一個方法來完成這項工作。考慮QLabel小部件,它可以在初始化程序中通過setText方法設置標籤的文本。

其他代碼的想法提示。

你初始化的變量,因爲你接受的參數任意數字,但只有做的第一個東西,希望它是一個字符串列表是一個有點混亂。一個明確的論點清單是重要的。

您使用的apply調用基類初始化是不必要的。將代碼更改爲qg.QTabWidget.__init__(self)

創建PyQt小部件時,即使知道小部件將成爲頂級小部件,我也幾乎總是喜歡允許「父」參數。這就是Pyqt所有內置方法所做的,並且感覺像是遵循的良好實踐。

我也看不出存儲選項卡的列表,每一個是單個元素字典的原因。我懷疑你不需要保留你自己的標籤和標籤名稱列表。 QTabWidget可以回答有關內容的所有問題。

如果我彎腰這個例子的代碼我自己的喜好,將這個樣子。

from PyQt4 import QtCore as qc 
from PyQt4 import QtGui as qg 


class wqTabWidget(qg.QTabWidget): 
    def __init__(self, parent, tabNames): 
     qg.QTabWidget.__init__(self, parent) 
     self.createTabs(tabNames) 

    def createTabs(tabNames): 
     for name in tabNames: 
      tabWidget = qg.QWidget() 
      self.addTab(tabWidget, name) 


if __name__ == '__main__': 
    app = qg.QApplication(sys.argv) 
    window = wqTabWidget(None, ['hi', 'there', 'and', 'stuff']) 
    window.show() 
    app.exec_()