|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
Нарисовать, двигать, сохранить линию Qt 4.8.427.10.2017, 11:33. Показов 6824. Ответов 47
Метки нет (Все метки)
Можете сделать простой пример до максимально пункта какого не жалко?
1)создать массив ImageArray 300 на 300 который будет RGB изображением. 2)записать в ImageArray попиксельно через цикл For горизонтальную линию цветом(135,154,160) длинной 10 пикселей. 3)создать слайдер1,слайдер2 задают координаты ячейки в ImageArray с которой начинаем рисовать линию. 4)File save/File open/File Save As... сохраняют \ открывают значения слайдеров. Открыли файл и рисует линию в загруженных координатах. Когда выбираем File save/File open/File Save As видны эскизы\привью мелкой картинкой где в изображении в каждом файле красная линия 100 на 100 пикселей. Слайдеры и обновлять растеризацию ImageArray нужно не чаще 60 раз в сек по таймеру. Или слайдер задает FPS. Будут тяжелые расчеты. После моего усложнения будет мелкая прога рисовать абстракции от 10 параметров типа таких:
0
|
|
| 27.10.2017, 11:33 | |
|
Ответы с готовыми решениями:
47
pictureBox1_MouseMove как двигать линию по координатам курсора
Нарисовать параболу и двигать ее с помощью стрелок |
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 28.10.2017, 22:12 [ТС] | |
|
0_0
Я думал нажатие на кнопку clicked() генерирует сигнал. Где то созданный уже паблик слот у Label (по идее он уже там есть раз он в справке открытые слоты) принимает сигнал и производит действие. Странно… Добавил 1 слайдер, изменил слот на render. Подправите?
0
|
|
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 28.10.2017, 23:52 [ТС] | |
|
Двигает отрезок двумя слайдерами.
0
|
|
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 29.10.2017, 01:35 [ТС] | |
|
Добавлю слайдер “пустые вычисления” который будет увеличивать количество итераций For чтобы FPS сильно падал.
Задача: Динамически изменять частоту обновления растра или слайдеров (FPS) в зависимости от сложности вычислений (времени расчета и вывода растра). Показывать в верхнем правом углу 2 параметра: FPS: VozmoznUsloznRascet: Грубо алгоритм: VozmoznUsloznRascet //во сколько раз можно увеличить время расчета FPS // частота обновления растра и данных со слайдеров. TimeForRender //время расчета от "данные пришли" до "растр отображен" VozmoznUsloznRascet=(1/60)/TimeForRender Алгоритм: Уникальные данные пришли. Запуск таймера0. Заблокировать движение слайдера мышкой(или весь GUI). Делаем расчеты, показываем растр. Записать в сек. время работы в TimeForRender Найти VozmoznUsloznRascet=(1/60)/TimeForRender Если TimeForRender<1/60 то FPS=60 ждать в таймер0 значения 1/60 сек обновить растр и обнулить таймер0 иначе FPS=1/TimeForRender ждать в таймер0 значения 1/FPS обновить растр и обнулить таймер Slip., alexu_007, Какие то команды подскажете? Как заблокировать слайдер? Может нужен другой подход? Может похожий алгоритм уже есть в Qt и это велик?
0
|
|
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,348
|
|
| 29.10.2017, 22:21 | |
|
Никак не возьму в толк, зачем тебе слайдеры???
Если я правильно понял, тебе нужен мультик, красивая картинка размером 300х300. Её будет делать спец. функция - то есть заполнять массив, и этот массив нужно перерисовывать на экране. Ну так сделай для начала, что-бы горизонтальная черта по растру бегала. Сама, без слайдеров. Заодно и быстродействие оценишь, нужны тормоза в виде таймера или нет. ... Заблокировать движение слайдера мышкой(или весь GUI). Зачем тут нужен слайдер, и зачем его блокировать? Делаем расчеты, показываем растр. Какие расчёты, если данные уже пришли? Записать в сек. время работы в TimeForRender Найти VozmoznUsloznRascet=(1/60)/TimeForRender Для чего эти танцы с бубном? Что-бы на быстрых и медленных компьютерах крутилось одинаково? Это сложно. Нужно получить скорость процессора и скорость вывода графики, и от этого плясать. Забей, это задача не для новичка. Сделай проще, чтобы слайдером можно было скорость менять - как раз и слайдер пригодится. алгоритм1: получать данные, сразу их на экран, и так далее в цикле. если слишком быстро, алгоритм2: запускаем таймер по прерыванию таймера получаем данные, выводим на экран, ждём следующего прерывания таймера. слайдером меняем частоту срабатывания таймера p.s. меня 2 дня не будет
0
|
|
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|||||||
| 30.10.2017, 00:53 [ТС] | |||||||
|
Если будет нормальная производительность рендера и получиться сделать Алгоритм: Уникальные данные пришли. Запуск таймер0. остановить курсор мышки или остановить слайдер0 а текущем положении // не знаю что выбрать правильно Делаем расчеты, заполняем буфер изображения. // может правильней не setPixel а //заполнить массив как в обычном С++ ? Если расчеты завершены то TimeForRender=значение таймер0 VozmoznUsloznRascet=(1/60)/TimeForRender Если TimeForRender<1/60 то TimeOfFrame=1/60 FPS=60 иначе TimeOfFrame=TimeForRender FPS=1/TimeForRender если таймер0==TimeOfFrame то обновить растр стоп таймер0
0
|
|||||||
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,348
|
|
| 30.10.2017, 06:41 | |
|
Ну так в чём проблема? Что-бы "заблокировать" слайдер для пользователя, его свойство Enabled нужно переставить в false. Разблокировать соответственно в true.
Для записи/чтения файла вставь кнопки со слотами, как это сделать ты теперь умеешь - смотри ХеллоВорд. Рисовать на экране ты умеешь - растр нарисовал, чёрточку нарисовал и даже двигаться заставил. И всё, что ещё нужно то? Пиши свою гениальную прогу. И будет она тебе рисовать волшебные картинки.
0
|
|
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 30.10.2017, 20:28 [ТС] | |
|
Это вам так кажется что все просто.
Как я и думал…на частоту опроса слайдеров в Qt забили или я чего то не понял? Если время расчета For постоянно(как сейчас в примере кода ниже) то и FPS должны быть постоянные и ниже FPS монитора. Замеряю количество вызовов рисования от слайдера. FPS гуляет...при FPS монитора 60. Отсюда и лаги в GUI. Как задавать частоту отправки SIGNAL для всех слайдеров параметром? Может это? void QAbstractSlider::setRepeatAction ( SliderAction action, int thresholdTime = 500, int repeatTime = 50 ) [protected] Устанавливает действие действия, которое должно запускаться повторно с интервалами repeatTime, после начальной задержки порогового времени. Т.е. двигаем слайдер и он 500 мс ничего не делает а потом выдает сигналы каждые 50 мс? Где настройка частоты опроса… Или просто нельзя подсоединять сигнал слайдера valueChanged (int) к слоту класса. Нужен фильтр который будет записывать int в переменную и читать ее если расчет готов то 60 раз в сек или по требованию? Тогда зачем во всех книгах так пишут и в Assistant? Может можно читать слайдер без сигнал\слот? Иначе с этими сигналами и слотами какая то каша с не стабильными лагами... Вообще странная логика создателей Qt. Закомментируйте 32 строку: Потаскайте слайдер… Если слайдер двигают на малое расстояние то и частота отправки SIGNAL valueChanged (int) малая малый FPS. Если двигают на большое то частота может быть до 80…это какой то индусский код. Разве во всем мире не опрашивают слайдер с частотой работы монитора + уменьшают частоту если расчет не завершен? Грубейшая алгоритмическая ошибка Qt… Может я что то неправильно делаю? Можете подсказать синтаксис как вызывать некоторые команды? Хотелось бы сделать такой Алгоритм: //---------- Нажали слайдер //sliderPressed() Прочитали его значение // int value () const Деактивировать слайдер //? так и не понял какая команда?... Запуск таймер0 макс время счета 1 сек, // timer.elapsed() Запуск таймер1 вызов “обновить кадр” через 1/60 сек // QTimer::singleShot(16, this, SLOT(updateCaption())); пустой расчет For Если значение таймер0 <1/60 то стоп таймер0 Timer1Flag=1 иначе стоп таймер0 стоп таймер1 обновить растр Если таймер1 разрешен то обновить растр по его событию. //---------- Почему это так сложно…почему нет готового. Это ведь очевидное требование стабильный FPS. В итоге: Время заполнения массива может сильно меняться в процессе работы проги. Нужно чтобы слайдеры читались только если расчет завершен и выдавали максимум FPS но меньше 60. Большое время расчета? Тогда FPS низкие но постоянны. А не как сейчас.. то 5 то 90 и лаги лаги… =). Как вызывать и блокировать вывод растра массива? Он должен считаться в буфер а потом по 1 команде показывать.
0
|
|
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
||||||||||||||||
| 31.10.2017, 10:42 [ТС] | ||||||||||||||||
Добавлено через 1 минуту Заменить на
Из 3 книг единственный полезный пример кода…рукожопые авторы http://blog.harrix.org/article/4826 Пашет так:
Как сделать правильно?
0
|
||||||||||||||||
|
|
|
| 31.10.2017, 12:13 | |
|
Вы, судя по всему, выбрали не тот инструмент для решения своей задачи. Если нужно нарисовать кастомное окно в формочке, проще рисовать GLUTом или другим OpenGL решением. Виджеты Qt - очень неудачное решение для рисования картинок в реальном времени.
Частота опроса гуляет. Она и будет гулять. В Qt4 сигналы-слоты сделаны через строки, пересылаются через очередь сообщений (даже Direct, влияет он только на приоритет) и рисуются через WinGDI+. Откуда в этой связке скорость? Это в Qt5 можно попытаться повыпендриваться через прямой вызов метода, но вам же религия не позволит. Все таймеры ГУИ неточные, могут гулять на десятки и сотни миллисекунд. Точные таймеры грузят камень очень лихо. Точность работы слайдера в 60\75\120 FPS - вообще не тривиальное требование. Лично у меня, и, держу пари, не только у меня, Qt нужен для быстрого накидывания формочек для тупых манагеров и очень хорошей защиты тела приложения от взлома. Конкурентов по этим двум требованиям нет. Со скоростью и умом манагеров даже 1 FPS - достаточное быстродействие. Попробуйте пихать виджеты не в QWidget, а в QGraphicView, он, вроде как, за всё хорошее против всего плохого и живёт по заветам OpenGL, но это не точно. Как? Понятия не имею. Не пользовал. Полный перевод оффдоков есть на crossplatform.ru. Примеры идут в комплекте. Плюс, все примеры есть в комплекте поставки Qt, достаточно открыть справку в креаторе.
0
|
|
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|||
| 31.10.2017, 13:28 [ТС] | |||
|
Думал может модератор раздела покажет как можно ускорить… Упростил пример до нельзя, 1 слайдер и пустой For.
Хотел cделать проге сложный GUI с визуальной настройкой всего + скорость работы не на последнем месте…а выходит баян? Мой GUI это был hello world велик отрезки и точки которые рисовала видеокарта С++ Glut было 60 FPS...думал еще там добавить мелкие тяжелые куски расчетов на Ассемблер. У меня WinXP 1 ядро. Может тогда WinForms намного шустрей будет? Кроссплатформ ненужен, делаю для себя мелкую прогу.
0
|
|||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 31.10.2017, 14:38 | |
|
Excalibur921, рисование можно вынести в отдельный поток, чтобы перерисовка осуществлялась не для каждого положения слайдера во время перетаскивания, а например для каждого n-ого, когда предыдущая перерисовка завершилась. + отдельная перерисовка для события, когда пользователь отпускает левую клавишу мыши.
Естественно нужно будет потом пересылать картинку результата перерисовки через очередь событий в поток ГУИ через очередь событий (по виджету-слоту), либо пересылать только сообщение о обновлении картинки, а использовать общий объект картинки в памяти (и работать с ним из этих двух потоков - свой рисует, ГУИшный пересылает в видеокарту готовое изображение). Добавлено через 2 минуты Да, из своего потока обращаться к объектам ГУИ нельзя. Взаимодействие только через очереди событий (по сигналам-слотам или напрямую через эвенты)
0
|
|
|
|
|
| 31.10.2017, 14:43 | |
|
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 31.10.2017, 14:57 | |
|
Именно для "отрисовки линий и всё" лучше юзать непосредственно OpenGL - http://doc.qt.io/qt-5/QGLWidget.html#details , https://habrahabr.ru/post/206156/ , https://folkprog.net/podklyuchenie-opengl-v-qt/ ... Предварительно преобразовав массив линий в удобоваримый для неё вид.
Тогда никаких ассемблерных вставок - всё перекладывается на видеокарту и она уже будет считать всё. Тем более что расчёта координат и рендеринга она в первую очередь и предназначена.
0
|
|
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|||||
| 31.10.2017, 17:26 [ТС] | |||||
|
Может слайдер по дефалту перерисовывает 1000 раз в сек? Как отключать виджету или всем Antialiasing, TextAntialiasing и все что дает лаги. В assistant написно что GUI это pure cpu render. Может по дефалту перерисовка слайдеров идет по событию valuechanged(int)? Т.е. если слайдер имеет 200 делений…т.е. перерисовка может быть 200 раз + CPU Antialiasing…что и дает лаги. Очень сомневаюсь что создатели Qt сделали примерно так: 1)Рисуем тело слайдера линию и черточки. 2)Делаем суперсемплинг. 3)Сохраняем текстуру в буфер. 4)Ручка слайдера все тоже…остается двигать текстуру “ручка слайдера” через видеокарту по событию перерисовки. В итоге от параметра двигаем мелкую текстуру видеокартой. Скорей всего там так: 1)Нарисовать весь слайдер c ручкой. 2)Суперсемплинг Повтор пунктов 1 и 2 по сигналу ValueChanged(int) Выглядят слайдеры одинаково а скорость работы первый метод реального времени почти 0% CPU второй будет лютые лаги 100% CPU. Подсказали так Нарисовать, двигать, сохранить линию Qt 4.8.4 Там столько этих методов рисования…черт ногу сломит. Изначально хотелось бы попробовать получить серый растр из первого расчет на pure cpu. И глянуть на скорость. Весь расчет считает попиксельно. Тут нет примитивов( пастеризаций кругов радиусом N пикселей, или отрезков и т.д) . Я думаю тут нет смысла брать видеокарту.
0
|
|||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 31.10.2017, 17:45 | ||
|
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 31.10.2017, 18:55 | ||
|
P.S. делал под Qt5.3, так что Для Qt4.8 нужно будет убрать "widgets" из rastr.pro и подшаманить инклуды.
0
|
||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|||||||
| 31.10.2017, 19:37 [ТС] | |||||||
|
Так вы отключили всю нагрузку… widget.cpp
Как сделать чтобы FPS был максимально высокие и ниже 60 и если меняется время расчета в For? Я считал количество входов в слот render(); переменная “a”...ваш метод я не знаю. Пример: Я рисую окружность из i < 10 000 точек. Время работы For 0.01 сек Поменяю параметр и будет рисовать из i < 1 000 000 точек, тогда Время работы For 0.95 сек. Как сделать чтобы FPS уменьшились в зависимости сложности вычислений т.е. от времени работы цикла For и были хоть примерно постоянны? Сейчас FPS сильно меняются и не стабильны. Можно назвать алгоритм адаптивный FPS. Мне нужны примерно постоянные FPS. Т.к. если нет то растр который я рисую будет меняться рывками и нелинейно. Пусть даже падает до 5 FPS лишь бы постоянные а не прыгали. Как отключить анизотропную фильтрацию всему GUI? Как еще можно ускорить?
0
|
|||||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||||
| 31.10.2017, 20:17 | ||||||||
|
Добавлено через 5 минут Добавлено через 14 минут Хотя можно и вот так (это в общем совпадает с вашим подходом):
0
|
||||||||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
||||
| 31.10.2017, 21:35 [ТС] | ||||
|
Предлагали также сложней: Вот тут алгоритм
0
|
||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 31.10.2017, 22:22 | ||
|
0
|
||
| 31.10.2017, 22:22 | |
|
Нарисовать заданные фигуры и сделать, чтобы их можно было двигать
Нарисовать линию Нарисовать линию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|