|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
Нарисовать, двигать, сохранить линию Qt 4.8.427.10.2017, 11:33. Показов 6661. Ответов 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
|
|
|
736 / 703 / 110
Регистрация: 29.05.2015
Сообщений: 4,293
|
|
| 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
|
|||||||
|
736 / 703 / 110
Регистрация: 29.05.2015
Сообщений: 4,293
|
|
| 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 | |
|
Помогаю со студенческими работами здесь
40
Нарисовать заданные фигуры и сделать, чтобы их можно было двигать
Нарисовать линию Нарисовать линию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает.
В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше.
Перед запуском проверяем. . .
|
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов.
В Main создаём четыре события. . . .
|
Модель здравоохранения 12. добавление болезней через ресурпул, как аварии
anaschu 22.05.2026
Болезни — это ключевая часть нашей модели. Нам нужно, чтобы работник периодически уходил на больничный, его задание при этом зависало, а после выздоровления работа возобновлялась. Реализуем это двумя. . .
|
Модель здравоохранения 11. Создаём классы Задание и Работник
anaschu 22.05.2026
В AnyLogic каждая заявка и каждый ресурс — это объект определённого класса. Нам нужно создать два класса: Задание (заявка) и Работник (ресурс).
Класс Задание
В дереве проекта нажимаем правой. . .
|
|
Модель здравоохранения 10. Новая модель, смотрим, как добавлять логические блоки, и что писать внутри
anaschu 22.05.2026
Открываем AnyLogic, создаём новый проект. В дереве проекта появляется класс Main — это главный агент, в котором будет жить вся наша логика.
Палитра блоков
Слева находится палитра. Нас интересует. . .
|
модель ЗдравоСохранения 9. Новая модель, разбираемся, как ее создавать
anaschu 22.05.2026
В этой серии постов мы построим модель небольшого рабочего коллектива. Сотрудники получают задания, выполняют их, иногда болеют — и мы хотим посчитать, сколько это стоит компании.
Метод. . .
|
[golang] Linked list
alhaos 22.05.2026
Связный список / Linked list
Связный список структура данных позволяющая хранить список значений, в отличии от массива в памяти хранится не сплошным куском, а отдельными частями которые ссылаются. . .
|
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча
Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове.
Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
|