Создание таблицы tableWidget
Не получается создать таблицу в pyside2. Есть два файла один со всем интерфейсом , второй который его запускает.
файл 1
from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
QObject, QPoint, QRect, QSize, QTime, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter,
QPixmap, QRadialGradient)
from PySide2.QtWidgets import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(1023, 443)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.tableWidget = QTableWidget(self.centralwidget)
self.tableWidget.setObjectName(u"tableWidget")
self.tableWidget.setGeometry(QRect(10, 60, 1001, 331))
self.pushButton = QPushButton(self.centralwidget)
self.pushButton.setObjectName(u"pushButton")
self.pushButton.setGeometry(QRect(20, 10, 75, 23))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 1023, 21))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.pushButton.setText(QCoreApplication.translate("MainWindow", u"submit", None))
# retranslateUi
файл 2
from PySide2 import QtCore, QtGui, QtWidgets
from UI_api import Ui_MainWindow
import sys
import os
import PySide2
# crate app
app = QtWidgets.QApplication(sys.argv)
# Create form and init UI
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
def get_data():
data = "{\"events\": {\"050719\": {\"Type\": \"Conference\", \"Published\": \"4\", \"Sent\": \"3\", \"Date\": \"05.07.2019\"}, \"050919\": {\"Type\": \"Conference\", \"Published\": \"23\", \"Sent\": \"35\", \"Date\": \"05.09.2019\"}, \"120719\": {\"Type\": \"Conference\", \"Published\": \"3\", \"Sent\": \"4\", \"Date\": \"12.07.2019\"}, \"150719\": {\"Type\": \"Conference\", \"Published\": \"4\", \"Date\": \"15.07.2019\", \"Sent\": \"2\"}}}"
d = json.loads(data)
keys = ["Date", "Type", "Published", "Sent"]
labels = keys + ["ID"]
w = ui.tableWidget
w.setColumnHidden(4, True)
w.setHorizontalHeaderLabels(labels)
for i, (key, value) in enumerate(d["events"].items()):
rows = [value[k] for k in keys] + [key]
w.insertRow(w.rowCount())
for j, v in enumerate(rows):
it = QtWidgets.QTableWidgetItem(v)
w.setItem(i, j, it)
ui.pushButton.clicked.connect(get_data)
sys.exit(app.exec_())
проблема в том что функция get_data() не возвращает данные , а только вставляет вертикальные номера строк. Подскажите, как с такой архитектурой (имеется ввиду через 2 файла) создать таблицу.
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Надо указать количество столбцов - тогда заработает:
w.setColumnCount(len(labels))
w.setHorizontalHeaderLabels(labels)
Рекомендую немного изменить архитектуру приложения. Так вам будет проще управлять вашими файлами проекта:
Файл main.py:
import sys
import os
from PySide2.QtWidgets import QApplication, QMainWindow
from MainWindow import MainWindow
if __name__ == "__main__":
app = QApplication([])
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
Файл главного окна приложения MainWindow.py:
from PySide2 import QtCore
from PySide2.QtWidgets import QMainWindow, QTableWidgetItem
from Ui_MainWindow import Ui_MainWindow
import json
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.get_data)
# Заголовок таблицы задается один раз в конструкторе
self.keys = ["Date", "Type", "Published", "Sent"]
labels = self.keys + ["ID"]
w = self.ui.tableWidget
w.setColumnHidden(4, True)
w.setColumnCount(len(labels))
w.setHorizontalHeaderLabels(labels)
# Реакция на нажатие кнопки
def get_data(self):
data = "{\"events\": {\"050719\": {\"Type\": \"Conference\", \"Published\": \"4\", \"Sent\": \"3\", \"Date\": \"05.07.2019\"}, \"050919\": {\"Type\": \"Conference\", \"Published\": \"23\", \"Sent\": \"35\", \"Date\": \"05.09.2019\"}, \"120719\": {\"Type\": \"Conference\", \"Published\": \"3\", \"Sent\": \"4\", \"Date\": \"12.07.2019\"}, \"150719\": {\"Type\": \"Conference\", \"Published\": \"4\", \"Date\": \"15.07.2019\", \"Sent\": \"2\"}}}"
d = json.loads(data)
w = self.ui.tableWidget
# Очищаем таблицу и вставляем в нее данные
w.setRowCount(0)
for i, (key, value) in enumerate(d["events"].items()):
rows = [value[k] for k in self.keys] + [key]
w.insertRow(w.rowCount())
for j, v in enumerate(rows):
it = QTableWidgetItem(v)
w.setItem(i, j, it)
Файл Ui_MainWindow остается тем же.