【发布时间】:2019-07-04 17:23:35
【问题描述】:
我正在开发数据分析软件,它从远程数据库中获取数据并将其放入QTableWidget。我怎样才能有效地从表中获取这些数据并将它们放入 QChart?
我已经看到,如果我一直在使用 QTableView,它可以用模型来完成,但据我了解,使用 QTableView 会复杂得多适合我的场景。
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *
from PySide2.QtCharts import *
import sys
import random
class DateTimeDelegate(QStyledItemDelegate):
def initStyleOption(self, option, index):
super(DateTimeDelegate, self).initStyleOption(option, index)
value = index.data()
option.text =
QDateTime.fromMSecsSinceEpoch(value).toString("dd.MM.yyyy")
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setGeometry(0, 0, 1280, 400)
self.chart_table()
self.populate()
def chart_table(self):
self.table = QTableWidget(0, 2)
delegate = DateTimeDelegate(self.table)
self.table.setItemDelegateForColumn(0, delegate)
chart = QtCharts.QChart()
self.chartView = QtCharts.QChartView(chart)
self.chartView.setFixedSize(600, 430)
splitter = QSplitter(self)
splitter.addWidget(self.table)
splitter.addWidget(self.chartView)
self.setCentralWidget(splitter)
series = QtCharts.QLineSeries(name='Odoslané')
mapper = QtCharts.QVXYModelMapper(xColumn=0, yColumn=2)
mapper.setModel(self.table.model())
mapper.setSeries(series)
chart.addSeries(mapper.series())
self.axis_X = QtCharts.QDateTimeAxis()
self.axis_X.setFormat("MMM yyyy")
self.axis_Y = QtCharts.QValueAxis()
chart.setAxisX(self.axis_X, series)
chart.setAxisY(self.axis_Y, series)
self.axis_Y.setRange(0, 0)
self.axis_Y.setLabelFormat('%.0f')
self.axis_X.setRange(QDate(2017, 10, 1), QDate.currentDate())
chart.setTitle('Chart')
def addRow(self, dt, value):
self.table.insertRow(0)
for col, v in enumerate((dt.toMSecsSinceEpoch(), value)):
it = QTableWidgetItem()
it.setData(Qt.DisplayRole, dt.toMSecsSinceEpoch())
self.table.setItem(0, 0, it)
t_m, t_M = self.axis_X.min(), self.axis_X.max()
t_m = min(t_m, dt)
t_M = max(t_M, dt)
m, M = self.axis_Y.min(), self.axis_Y.max()
m = min(m, value)
M = max(M, value)
在这种方法中,当我从数据库中获取数据时,我会模拟用数据填充表格。
def populate(self):
for i in range(4):
count=random.randint(1,40)
value_str = QDate.currentDate().addDays(count).toString('dd.MM.yyyy')
dt = QDateTime.fromString(value_str, "dd.MM.yyyy")
sent = QTableWidgetItem(str(count))
value = int(sent.text())
self.addRow(dt, value)
self.table.setItem(0, 1, sent)
以及App运行功能-
def main():
app = QApplication(sys.argv)
gui = MainWindow()
gui.show()
sys.exit(app.exec_())
main()
【问题讨论】:
-
PySide 还是 PySide2? PyQt4 还是 PyQt5?除了显示条目之外,您还可以解释您想要什么样的情节。如果将解决方案与 QTableView 链接起来也很棒。
-
为了记录,我使用的是PySide2(但为了得到原理的答案,我概括了)。我想使用简单的 QLineSeries x 轴图表,其中包含 DateTime 和 y 轴实数。至于实际的解决方案,没有任何解决方案——这就是我问这个问题的原因。
-
始终使用正确的标签,因为每个库都有其局限性,例如在 PySide 和 PyQt4 中没有 QLineSeries。您可以放置一个 QTableWidget 的示例:例如 datetime 的格式是什么?这样我可以很容易地帮助您
-
不,我不同意。主要标签是吸引注意力的标签(在您的情况下是python),其他标签表明答案的局限性(正如我在之前的评论中指出的,某些库具有/或不具有某些功能)跨度>
-
我目前正在使用格式化为字符串的 QDate 对象,然后将其添加到表中。如果我没记错的话,可以选择将其转换回 QDate
标签: python qtablewidget pyside2 qtcharts