1

私は以下のコードを持っています。私はいくつかのクラスをすべて同じ「インポート」内に作成することを計画していました。各クラスをインスタンス化し、作成中のウィジェットで戻り値を取得したいと考えていました。

これは実際には 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

1 に答える 1

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_()
于 2009-08-21T05:24:50.637 に答える