Qml Осциллограф (Qml Oscilloscope)

В этом примере показано, как реализовать приложение со строгими требованиями к производительности используя Qt Chart QML API.

Приложение «Осциллограф» демонстрирует как использовать QtCharts QML API для реализации приложения со строгими требованиями к производительности. Приложение использует сгенерированные данные с настраиваемыми характеристиками для имитации простого пользовательского интерфейса осциллографа.

Чтобы получить информацию о фактической скорости рендеринга, отображаемой в консоли вывода приложения, вы можете установить OSG_RENDER_TIMING = 1 в настройках среды выполнения.

Запуск примера

Чтобы запустить пример из QT Creator, откройте окно приветствия  и выберите и выберите QML Oscilloscope в разделе «Примеры». Для получения дополнительной информации ознакомьтесь с «Сборка и Запуск Примера»

Создание Вида

Окно приложения разделяется на элементы управления и отображение осциллограммы.

Item {

id: main
width: 600
height: 400

ControlPanel {

id: controlPanel
anchors.top: parent.top
anchors.topMargin: 10
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.leftMargin: 10
...

ScopeView {
id: scopeView
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.left: controlPanel.right
height: main.height

onOpenGLSupportedChanged: {

if (!openGLSupported) {

controlPanel.openGLButton.enabled = false
controlPanel.openGLButton.currentSelection = 0

}

}

}

ControlView реализует кнопки, используемые для настройки. ScopeView использует ChartView для отображения диаграммы с двумя линейными рядами:

ChartView {

id: chartView
animationOptions: ChartView.NoAnimation
theme: ChartView.ChartThemeDark
property bool openGL: true
property bool openGLSupported: true
onOpenGLChanged: {

if (openGLSupported) {

series("signal 1").useOpenGL = openGL;
series("signal 2").useOpenGL = openGL;

}

}
Component.onCompleted: {

if (!series("signal 1").useOpenGL) {

openGLSupported = false
openGL = false

}

}

ValueAxis {

id: axisY1
min: -1
max: 4

}

ValueAxis {

id: axisY2
min: -10
max: 5

}

ValueAxis {

id: axisX
min: 0
max: 1024

}

LineSeries {

id: lineSeries1
name: "signal 1"
axisX: axisX
axisY: axisY1
useOpenGL: chartView.openGL

}
LineSeries {

id: lineSeries2
name: "signal 2"
axisX: axisX
axisYRight: axisY2
useOpenGL: chartView.openGL

}
...

Данные графиков обновляются таймером QML. В реальном приложении обновление может быть вызвано сигналом из кода Qt C ++.

Timer {

    id: refreshTimer
    interval: 1 / 60 * 1000 // 60 Hz
    running: true
    repeat: true
    onTriggered: {

    dataSource.update(chartView.series(0));
    dataSource.update(chartView.series(1));

    }

}

Осциллограф также позволяет вам переключать тип серии, используемой для визуализации источников сигнала. Это осуществляется путем динамического уничтожения и создания серии:

function changeSeriesType(type) {

chartView.removeAllSeries();

// Create two new series of the correct type. Axis x is the same for both of the series,
// but the series have their own y-axes to make it possible to control the y-offset
// of the "signal sources".
if (type == "line") {

var series1 = chartView.createSeries(ChartView.SeriesTypeLine, "signal 1",
axisX, axisY1);
series1.useOpenGL = chartView.openGL

var series2 = chartView.createSeries(ChartView.SeriesTypeLine, "signal 2",
axisX, axisY2);
series2.useOpenGL = chartView.openGL

} else {

var series1 = chartView.createSeries(ChartView.SeriesTypeScatter, "signal 1",
axisX, axisY1);
series1.markerSize = 2;
series1.borderColor = "transparent";
series1.useOpenGL = chartView.openGL

var series2 = chartView.createSeries(ChartView.SeriesTypeScatter, "signal 2",
axisX, axisY2);
series2.markerSize = 2;
series2.borderColor = "transparent";
series2.useOpenGL = chartView.openGL

}

}

function createAxis(min, max) {

// The following creates a ValueAxis object that can be then set as a x or y axis for a series
return Qt.createQmlObject("import QtQuick 2.0; import QtCharts 2.0; ValueAxis { min: "
+ min + "; max: " + max + " }", chartView);

}

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.