минимальный пример qtreeview для pyqt и дизайнера qt

Я пытаюсь получить минимальный пример для приложения, разработанного дизайнером 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 этого файла? пользовательский интерфейс кажется немного грязным

3) например, было бы лучше иметь метод add_item в подклассе окна, созданного файлом *.ui, мы должны использовать промежуточный шаг преобразования файла *.ui в файл *.py?


person thafritz    schedule 24.07.2012    source источник
comment
Вопросы 2 и 3 следует выделить в новый вопрос. Но я уверен, что это и есть ваш ответ. В частности, функция loadUi.   -  person jkerian    schedule 21.10.2013


Ответы (2)


Вы просто забыли установить модель в свой QTreeView. Прямо сейчас в древовидном представлении нет модели, поэтому оно никогда не видит обновление данных:

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

Кроме того, в качестве предложения сэкономьте время на наборе текста и используйте соединения сигнала/слота нового стиля, которые являются более питоническими и не заставляют вас вводить подписи:

self.ui.pushButton_NeuesMoebel.clicked.connect(self.add_item)
person jdi    schedule 26.07.2012

Я только что наткнулся на этот вопрос и очень рад, что сделал это. Это заставило меня изучить использование модуля uic, который я игнорировал. За все годы, что я использовал pyqt, я всегда генерировал файл .py из файла .ui дизайнера, а затем импортировал сгенерированный файл как модуль.

Использование 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)
....
person Eric Myers    schedule 26.12.2014