Python pyqt和qt设计器的最小示例qtreeview

Python pyqt和qt设计器的最小示例qtreeview,python,pyqt,designer,qtreeview,Python,Pyqt,Designer,Qtreeview,我试图获得一个由qt设计器设计的应用程序的最小示例,该应用程序使用pyqt,涉及QTreeView 1) 我可以用这种方式启动应用程序,但如果我按下按钮,TreeView小部件中不会显示任何条目,我不会收到任何错误消息,布局看起来也不错,是否有某种更新方法 如果你回答,请具体说明,因为我还是QT初学者,很多文档都是用C++的例子写的,我只对C和Python 有一些经验。 from PyQt4 import uic, QtGui, QtCore (Ui_MainWindow, QMainWin

我试图获得一个由qt设计器设计的应用程序的最小示例,该应用程序使用pyqt,涉及QTreeView

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文件,直接对该文件的主窗口进行子类化?ui的东西看起来有点乱


3) 例如,在由*.ui文件创建的窗口的子类中使用add_item方法会更好,我们是否应该使用将*.ui文件转换为*.py文件的中间步骤?

您只是忘记了在QTreeView上设置模型。现在树视图没有模型,因此它永远看不到数据更新:

def __init__(self, parent=None):
    ....
    self.ui.treeView.setModel(self.model)
另外,建议您省去一些键入操作,并使用新型的信号/插槽连接,这些连接更具pythonic风格,不会让您键入签名:

self.ui.pushButton_NeuesMoebel.clicked.connect(self.add_item)

我刚刚遇到了这个问题,真的很高兴我这么做了。这让我开始考虑使用uic模块,而我一直忽略了这一点。在我使用pyqt的所有年份中,我总是从designer.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)
....

问题2和问题3应分开成一个新问题。但我很确定这是你的答案。特别是loadUi函数。