3

QTreeView を含む pyqt を使用して qt デザイナーによって設計されたアプリケーションの最小限の例を取得しようとしています。

1) この方法でアプリを起動できますが、ボタンを押すと、TreeView ウィジェットにエントリが表示されず、エラー メッセージも表示されず、レイアウトも正常に見えます。何らかの更新方法はありますか?

私はまだqtの初心者であり、ドキュメントの多くはc ++の例で書かれており、基本的なcとpythonの経験しかありません。

from PyQt4 import uic, QtGui, QtCore


(Ui_MainWindow, QMainWindow) = uic.loadUiType('main_window.ui')


class MainWindow(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.model = QtGui.QStandardItemModel()
        self.connect(self.ui.pushButton_NeuesMoebel, QtCore.SIGNAL('clicked()'), self.add_item)

    def add_item(self):
        t = self.ui.lineEdit_Moebel.text()
        if len(t) > 0: 
            item = QtGui.QStandardItem(t)
            self.model.appendRow(item)
            self.ui.lineEdit_Moebel.clear()
        else:
            self.ui.statusBar.showMessage('error: no text in Moebel')


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

2) さらに、これより *.ui ファイルを直接使用して、そのファイルの MainWindow を直接サブクラス化するよりクリーンな方法はありますか? UI は少し乱雑に見えます

3) たとえば、*.ui ファイルによって作成されたウィンドウのサブクラスに add_item メソッドを含めたほうがよいでしょう。*.ui ファイルを *.py ファイルに変換する中間ステップを使用する必要がありますか?

4

2 に答える 2

2

QTreeView でモデルを設定するのを忘れただけです。現在、ツリー ビューにはモデルがないため、データの更新は表示されません。

def __init__(self, parent=None):
    ....
    self.ui.treeView.setModel(self.model)

また、提案として、入力を節約し、新しいスタイルのシグナル/スロット接続を使用します。これは、より Pythonic であり、署名を入力する必要はありません。

self.ui.pushButton_NeuesMoebel.clicked.connect(self.add_item)
于 2012-07-26T05:44:56.627 に答える
0

この質問に出くわしたばかりで、本当にうれしく思います。無視してきた uic モジュールの使用を検討するようになりました。私が pyqt を使用してきたすべての年で、私は常にデザイナーの .ui ファイルから .py ファイルを生成し、生成されたファイルをモジュールとしてインポートしてきました。

代わりに uic を使用して .ui ファイルを直接ロードすると、ステップが節約され、作業が大幅に簡素化されます。やり方は簡単です。

はい、質問 2 の答えとして、UI を呼び出すよりも簡単な方法があります。

from PyQt4 import uic, QtGui, QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self,parent)
        uic.loadUi('main_window.ui',self)
....
于 2014-12-26T00:57:15.870 に答える