我正在尝试使用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的中间步骤文件?
答案 0 :(得分:2)
您忘了在QTreeView上设置模型。现在,树视图没有模型,因此它永远不会看到数据更新:
def __init__(self, parent=None):
....
self.ui.treeView.setModel(self.model)
另外作为建议,请保存自己的一些打字并使用更加pythonic的新式信号/插槽连接,并且不会让你输入签名:
self.ui.pushButton_NeuesMoebel.clicked.connect(self.add_item)
答案 1 :(得分: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)
....