
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.90] |
![]() |
|
![]() |
|
|
Здравствуйте!
Мне хотелось бы перевести программу на C# (получение данных с АЦП, демо-программу Adc_demo.zip прикрепил, недостатков в ней много, но работает) на QT. В программе выводятся через заданные промежутки времени показания датчиков, подключенных к АЦП. Сделал тестовый проект на QT. В тестовом проекте на QT график рисуется статично, причем если задать много точек, то программа зависает и переключение на график после нажатия кнопки Старт происходит только после большого промежутка времени. Подскажите, пожалуйста, как сделать так, чтобы в программе на QT также, как и в программе на C#: - динамично добавлялись данные на график; - была возможность просмотра графиков (возможность переключения на вкладку Графики) сразу после нажатия на кнопку Старт; - динамически изменялись максимальные и минимальные значения по оси Y и максимальное значение по оси X. Кроме того, хотелось бы также узнать, можно ли указать параметр для Operation в строке ![]() ![]() connect(btnStart, &QPushButton::clicked, this, &MainWindow::Operation) ![]() ![]() connect(btnStart, &QPushButton::clicked, this, &MainWindow::Operation(flagMode::start)) Прикреплённый файл ![]() Прикреплённый файл ![]() |
Сообщ.
#2
,
|
|
|
tumanovalex, у тебя несколько "узкоспециализированные" вопросы. Не уверен, что кто-то захочет погружаться в твои проблемы на достаточном тебе уровне. И, тем не менее, на часть вопросов в некотором "общем смысле" я постараюсь ответить.
Цитата tumanovalex @ - динамично добавлялись данные на график; Сразу вспоминаем основную фишку взаимодействия компонентов при использовании Qt - это "сигналы/слоты". Это с одной стороны. А вот с другой - вспоминаем что фрэймворк Qt реализует парадигму "MVC". А это значит, что мы должны "разбросать" определённые действия на разные компоненты создаваемой системы. Упрощённый пример: 1) Компонент1 твоей системы собирает с датчиков параметры и заносит их в твою Модель1 2) Модель1 по факту своего обновления эмитирует Сингал1 3) Любые вьюхи (таблицы, графики, просто индикаторы), которые "подписаны" на Сигнал1, по факту получения сигнала - заново выбирают данные из Модели1 и их перерисовывают Цитата tumanovalex @ - была возможность просмотра графиков (возможность переключения на вкладку Графики) сразу после нажатия на кнопку Старт; Не понятен вопрос. Но это похоже на "обновить-данные + перерисовать". Также реализуется выбросом сигнала. Цитата tumanovalex @ - динамически изменялись максимальные и минимальные значения по оси Y и максимальное значение по оси X. Тут скорее не алгоритмический вопрос, сколько просто "математический". Решается введением дополнительного первого запроса - который получает минимальные и максимальные значения по всей доступной выборке. Потом добавляем +10% к этим значениям чисто для красоты, ну а выводимые данные, понятное дело, уже как-то масштабируются к определённым координатам и их масштабированию. Цитата tumanovalex @ Кроме того, хотелось бы также узнать, можно ли указать параметр для Operation в строке Вообще такое делать не рекомендуется. Но если очень хочется, то можно замутить что-то типа "proxy" передачи сигнала. Т.е. на первом шаге мы делаем коннект на &MainWindow::Operation1, а уже в нём мы генерируем сигнал с параметром, и плюс к нему делаем ещё одну связку сигнала с параметром и слота с параметром. Повторюсь - такое я считаю костылём. Надо переосмыслить взаимодействие компонентов еще более внимательно. |
Сообщ.
#3
,
|
|
|
Спасибо за ответ. Но мне кажется, что мой вопрос - не очень узко специализированный. Вопрос в том, как при наличии нескольких вкладок на одной из них выводить график с данными, которые поступают от одной из систем ПК (например, аудио, видео) или внешних датчиков, и при этом иметь возможность переключаться между вкладками. Наверное, для этого нужно использовать потоки. С потоками я еще не работал. Буду разбираться.
|
Сообщ.
#4
,
|
|
|
Цитата tumanovalex @ Наверное, для этого нужно использовать потоки. С потоками я еще не работал. Буду разбираться. Ну да, конечно! Обычно в основном потоке (GUI-потоке) тяжёлые и/или ожидающие вычисления не делаются. Тебе нужно запустить поток, который будет получать данные из-вне, а по факту получения эмитировать сигнал. GUI-поток, по факту получения сигнала будет перерисовывать везде всё что нужно. |