PyQt5: эффективное добавление переменных к объекту QSplineSeries? - PullRequest
0 голосов
/ 26 мая 2020

Цель: простое приложение для просмотра / построения графика данных об окружающей среде в зависимости от времени (температура, давление, влажность, яркость).

Вот скриншот приложения:

App Screengrab

Я относительно новичок в Qt, поэтому надеюсь, что смогу объяснить это адекватно ...

проблема: код работает, приложение запускается медленно, я считаю, что это как-то связано с тем, как я добавляя данные к каждой серии для построения графика (см. код для графика температуры ниже), в настоящее время я просматриваю каждую строку данных, которые были прочитаны (из CsvReader), беру временные данные и данные температуры (или другие) и добавляю их к объекту серии. Кажется, из-за этого приложение медленно запускается? Есть ли способ сделать это более эффективно? Я пробовал добавить полный набор данных за пределы l oop, но объект QSplineSeries не принимает списки, есть ли уловка, которую мне здесь не хватает?

Примечание: продукт fini sh выиграл не отображать все данные, как показано на скриншоте, мы надеемся, что он покажет определенный пользователем диапазон. Снизит ли это снижение производительности, которое я наблюдаю в настоящее время?

Любая помощь будет принята с благодарностью, спасибо.

class TempPlot(qtch.QChartView):

chartTitle = CsvReader()._headers[1]

def __init__(self):
    super().__init__()

    # Create QChart object
    chart = qtch.QChart(title=self.chartTitle)
    self.setChart(chart)

    # Create series object
    self.series = qtch.QSplineSeries(name='Degrees Celsius')
    chart.addSeries(self.series)

    # Next populate a series object with the data
    startTime = qtc.QDateTime.fromString(CsvReader()._data[0][0], 'dd/MM/yyyy hh:mm')
    endTime = qtc.QDateTime.fromString(CsvReader()._data[-1][0], 'dd/MM/yyyy hh:mm')
    tick = int(len(CsvReader()._data)/(7*48))

    for row in CsvReader()._data:
        tempVal = float(row[1])
        timeVal = qtc.QDateTime.fromString(row[0], 'dd/MM/yyyy hh:mm').toMSecsSinceEpoch()
        self.series.append(timeVal, tempVal) 

    # format the axes
    xAxis = qtch.QDateTimeAxis()
    xAxis.setTickCount(tick)
    xAxis.setFormat('dd/MM/yyyy hh:mm')
    xAxis.setRange(startTime, endTime)
    yAxis = qtch.QValueAxis()
    yAxis.setRange(-10, 50)
    chart.setAxisX(xAxis, self.series)
    chart.setAxisY(yAxis, self.series)

    # As we are using curves there is one appearance optimization to do:
    self.setRenderHint(qtg.QPainter.Antialiasing)

# We can enable the user to pan around the chart by overriding the keyPressEvent() method in the QChart Object
def keyPressEvent(self, event):
    keymap = {
        qtc.Qt.Key_Up: lambda: self.chart().scroll(0, -10),
        qtc.Qt.Key_Down: lambda: self.chart().scroll(0, 10),
        qtc.Qt.Key_Right: lambda: self.chart().scroll(-10, 0),
        qtc.Qt.Key_Left: lambda: self.chart().scroll(10, 0),
        qtc.Qt.Key_Greater: self.chart().zoomIn,
        qtc.Qt.Key_Less: self.chart().zoomOut
    }
    callback = keymap.get(event.key())
    if callback:
        callback()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...