PyQt和QT Designer中的最小示例QTreeView

4

我正在尝试使用pyqt设计Qt Designer应用程序的最小示例,其中涉及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文件来直接子类化该文件中的MainWindow?UI相关的东西似乎有些混乱。

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


问题2和问题3应该分开成一个新的问题。但我相信这个链接是你要找的答案。具体来说,是loadUi函数。 - jkerian
2个回答

3

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

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

另外提个建议,为了减少输入量并使用更具Python风格、不需要手动输入签名的新式信号/槽连接:

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

0

我刚看到这个问题,很高兴我能看到它。这让我开始研究使用uic模块,这是我一直忽略的。在我使用pyqt的所有年份中,我总是从设计师.ui文件生成一个.py文件,然后将生成的文件作为模块导入。

使用uic而不是调用ui组件可以直接加载.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)
....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接