Разбор выходного сигнала. Список, содержащий список внутри PyQt5 Tableview - PullRequest
0 голосов
/ 03 мая 2020

У меня есть скрипт, который возвращает данные в формате dict внутри списка. Таким образом, мой список data [] содержит следующие данные


[['https://www.impasd.com.au/', 'https://www.impasd.com.au/who-we-are/'],['697559', '459048'], ['Full Service', 'Agency Partner']]

Я хотел бы отобразить эти данные внутри таблицы в PyQt5 TableView, которую я определил как Folow. Обновления данных работают, поэтому я хотел продолжать обновлять таблицу по мере обновления данных.

Теперь у меня есть PyQt5 windows, который выглядит как показано ниже. Большая белая секция определяется как TabelView enter image description here

Мой основной код PyQt5 - main.py

class Ui_MainWindow(QtWidgets.QMainWindow):
    def __init__(self) :
        super().__init__()

        self.table = QtWidgets.QTableView()
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1327, 901)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableView = QtWidgets.QTableView(self.centralwidget)
        self.tableView.setGeometry(QtCore.QRect(0, 0, 1331, 851))
        self.tableView.setObjectName("tableView")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

data = [['https://www.impasd.com.au/', 'https://www.impasd.com.au/who-we-are/'], ['697559', '459048'], ['Full Service', 'Agency Partner']]

        self.model = TableModel( data )
        self.table.setModel( self.model )

        self.setCentralWidget( self.table )

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Когда процесс запускается, мои данные доступны в основной класс, в котором я также определил модель

class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data
        print(self._data)

    def data(self, index, role):
        if role == Qt.DisplayRole:
            # See below for the nested-list data structure.
            # .row() indexes into the outer list,
            # .column() indexes into the sub-list
            return self._data[index.row()][index.column()]

    def rowCount(self, index):
        # The length of the outer list.
        return len(self._data)

    def columnCount(self, index):
        # The following takes the first sub-list, and returns
        # the length (only works if all rows are an equal length)
        return len(self._data[0])

и таблица не отображается. Что я могу делать не так?

---- ОБНОВЛЕНИЕ ----

Теперь я преобразовал свои результаты [] в список списков, поэтому вопрос немного изменился. «Анализ списка отправленных сигналов, содержащего LIST внутри PyQt5 Tableview»

Я также добился некоторого прогресса за последние несколько часов, поэтому окно срабатывает, и я не получаю сообщение об ошибке, и программа завершает работу с код выхода 0, а таблица пуста?

1 Ответ

1 голос
/ 03 мая 2020

Вы определяете два разных экземпляра QMainWindow, а именно MainWindow и ui. Каждый из них имеет QTableView в качестве центрального виджета, но вы устанавливаете модель только для одного из них, а именно ui.centralWidget(). Однако показано следующее окно: MainWindow, для которого не задана модель для представления таблицы.

Поскольку вы, похоже, редактировали файл .py, сгенерированный из Qt Designer + pyui c, я бы посоветовал вам сгенерировать .py из pyui c и вместо его непосредственного редактирования (что всегда плохо) создайте отдельный файл .py, в котором вы определяете класс, который наследуется от QMainWindow и Ui_MainWindow, чтобы настроить главное окно. Итак, предполагая, что Ui_MainWindow.py является выходным файлом Qt Designer, вы должны создать другой файл .py и сделать что-то вроде этого

import QtWidgets, QtCore
import Ui_MainWindow, TableModel

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        data = [['https://www.impasd.com.au/', 'https://www.impasd.com.au/who-we-are/'], 
                ['697559', '459048'], ['Full Service', 'Agency Partner']]
        self.setupUi(self)
        self.model = TableModel(data)
        self.tableView.setModel(self.model)

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    main_window = MainWindow()
    main_window.show()
    app.exec_()
...