2009-08-21 110 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_()