3

我正在尝试为由 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 文件的方法,直接将该文件的 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 回答