2012-07-24 52 views
3

我试图让一个小例子,对于涉及QTreeView则通过QT设计师设计的PyQt的应用程序的工作小例子,QTreeView则用于PyQt的和Qt设计

1)我就可以开始应用这种方式,但如果我推动butten,没有显示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进行子类化? 3)例如,在* .ui文件创建的窗口的子类中使用add_item方法会更好,我们应该使用翻译*的中间步骤, .ui文件到一个* .py文件?

+0

问题2和3应当分开出的新问题。但我很确定[this](http://stackoverflow.com/questions/17742673)是你的答案。具体来说就是loadUi函数。 – jkerian 2013-10-21 10:56:29

回答

2

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

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

另外,作为一个建议,可以救自己一些打字和使用是更Python和不新式的信号/槽连接让你输入签名:

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

感谢修正和tipp,它现在工作 – thafritz 2012-07-26 13:19:15

0

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

使用uic代替直接加载.ui文件可以节省一个步骤并简化一些操作。这很容易做到。

所以,是的,在回答问题2还有一个更简单的方法比调用用户界面的东西:

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) 
....