Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456

Нарисовать, двигать, сохранить линию Qt 4.8.4

27.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 параметров типа таких:
Название: ScreenShot00705.jpg
Просмотров: 204

Размер: 18.3 Кб
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2017, 11:33
Ответы с готовыми решениями:

pictureBox1_MouseMove как двигать линию по координатам курсора
делаю програмку в которой человек по данным графика выбирает себе значения переменных, хочу попробовать для удобства пользователя сделать...

Как нарисовать фигуру и двигать ее мышью?
Как нарисовать геометрическую фигуру (треугольник, квадрат, многоугольник) в окне? И как сделать так чтобы они двигались мышью?

Нарисовать параболу и двигать ее с помощью стрелок
Пожалуйста напишите программу которая рисует параболу,чтобы её можно было двигать с помощью стрелок

47
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
28.10.2017, 22:12  [ТС]
Студворк — интернет-сервис помощи студентам
0_0
Я думал нажатие на кнопку clicked() генерирует сигнал.
Где то созданный уже паблик слот у Label (по идее он уже там есть раз он в справке открытые слоты) принимает сигнал и производит действие. Странно…

Добавил 1 слайдер, изменил слот на render.
Подправите?
Вложения
Тип файла: 7z rastr1.7z (50.7 Кб, 1 просмотров)
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
28.10.2017, 23:52  [ТС]
Двигает отрезок двумя слайдерами.
Вложения
Тип файла: 7z rastr2.7z (325.9 Кб, 4 просмотров)
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  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
Никак не возьму в толк, зачем тебе слайдеры???
Будет мелкая прога расчет абстракций в реальном времени пока ведем слайдеры. С таким FPS как успеет. Делал прогу на С++ glut было 5 слайдеров, сделал свое уравнение для экспериментов и слайдеров стало 30… и будет больше.

Если будет нормальная производительность рендера и получиться сделать
Цитата Сообщение от Excalibur921 Посмотреть сообщение
4)File save/File open/File Save As... сохраняют \ открывают значения слайдеров.
то займусь экспериментами с фракталами то слайдеров будет порядка 300 штук чисто для экспериментов.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
После моего усложнения будет мелкая прога рисовать абстракции от 10 параметров типа таких:
Цитата Сообщение от alexu_007 Посмотреть сообщение
и зачем его блокировать?
Чтобы растр не обновлялся до окончания всех расчетов, это занимает CPU ненужными расчетами.
Цитата Сообщение от alexu_007 Посмотреть сообщение
Какие расчёты, если данные уже пришли?
Вместо одного For там будет несколько циклов, в одном будет порядка 100 000 итераций.
Цитата Сообщение от alexu_007 Посмотреть сообщение
Что-бы на быстрых и медленных компьютерах крутилось одинаково? Это сложно.
Разве? Один таймер и все.

Алгоритм:
Уникальные данные пришли.
Запуск таймер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.
Название: ScreenShot00773.jpg
Просмотров: 60

Размер: 12.1 Кб
Как задавать частоту отправки 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 команде показывать.
Вложения
Тип файла: 7z rastr4.7z (300.1 Кб, 6 просмотров)
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
31.10.2017, 10:42  [ТС]
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//QObject::connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(render()));
 
/*
QObject::connect(const QObject*     sender,
                 const char*        signal,
                 const QObject*     receiver,
                 const char*        slot,
                 Qt::ConnectionType type = Qt::AutoConnection
                );
*/
    QObject::connect(ui->horizontalSlider,
                     SIGNAL(valueChanged(int)),
                     this,
                     SLOT(render()),
                     Qt::ConnectionType type = Qt::AutoConnection             //<--------Eror
                    );
Как правильно? Хоть бы 1 пример кода был…

Добавлено через 1 минуту
Заменить на
C++ (Qt)
1
Qt::DirectConnection.
Добавлено через 12 минут
Из 3 книг единственный полезный пример кода…рукожопые авторы http://blog.harrix.org/article/4826
Пашет так:
C++ (Qt)
1
2
3
4
5
6
    QObject::connect(ui->horizontalSlider,
                     SIGNAL(valueChanged(int)),
                     this,
                     SLOT(render()),
                     Qt::DirectConnection
                    );
Всеравно FPS гуляет...походу и рисование окна через одно место сделана в Qt…
Как сделать правильно?
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
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 с визуальной настройкой всего + скорость работы не на последнем месте…а выходит баян?
Цитата Сообщение от icpu Посмотреть сообщение
проще рисовать GLUTом или другим OpenGL решением.
Уже делал… небыло подписей слайдеров, File-Save и т.д…
Мой GUI это был hello world велик отрезки и точки которые рисовала видеокарта С++ Glut было 60 FPS...думал еще там добавить мелкие тяжелые куски расчетов на Ассемблер.
У меня WinXP 1 ядро. Может тогда WinForms намного шустрей будет? Кроссплатформ ненужен, делаю для себя мелкую прогу.
Цитата Сообщение от icpu Посмотреть сообщение
QGraphicView
Попробую шаманить с ним. Но надежды мало…
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.10.2017, 14:38
Excalibur921, рисование можно вынести в отдельный поток, чтобы перерисовка осуществлялась не для каждого положения слайдера во время перетаскивания, а например для каждого n-ого, когда предыдущая перерисовка завершилась. + отдельная перерисовка для события, когда пользователь отпускает левую клавишу мыши.

Естественно нужно будет потом пересылать картинку результата перерисовки через очередь событий в поток ГУИ через очередь событий (по виджету-слоту), либо пересылать только сообщение о обновлении картинки, а использовать общий объект картинки в памяти (и работать с ним из этих двух потоков - свой рисует, ГУИшный пересылает в видеокарту готовое изображение).

Добавлено через 2 минуты
Да, из своего потока обращаться к объектам ГУИ нельзя. Взаимодействие только через очереди событий (по сигналам-слотам или напрямую через эвенты)
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
31.10.2017, 14:43
https://habrahabr.ru/post/338106/
0
зомбяк
 Аватар для TRam_
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  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
когда предыдущая перерисовка завершилась. + отдельная перерисовка для события, когда пользователь отпускает левую клавишу мыши.
Можете показать код перерисовка слайдера по таймеру интервал 0.5 сек самого слайдера?

Может слайдер по дефалту перерисовывает 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.

Цитата Сообщение от TRam_ Посмотреть сообщение
использовать общий объект картинки в памяти
Как рисовать в буфер изображения а затем показать по 1 команде?
Подсказали так Нарисовать, двигать, сохранить линию Qt 4.8.4
Там столько этих методов рисования…черт ногу сломит.
Изначально хотелось бы попробовать получить серый растр из первого расчет на pure cpu. И глянуть на скорость.
Цитата Сообщение от TRam_ Посмотреть сообщение
ГУИшный пересылает в видеокарту готовое изображение
Все расчеты pure cpu. Шейдеров у меня нет аппаратно.

Цитата Сообщение от TRam_ Посмотреть сообщение
или напрямую через эвенты
И как это сделать? Можете набросать пример?

Весь расчет считает попиксельно. Тут нет примитивов( пастеризаций кругов радиусом N пикселей, или отрезков и т.д) .
Я думаю тут нет смысла брать видеокарту.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.10.2017, 17:45
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Тут нет примитивов( пастеризаций кругов радиусом N пикселей, или отрезков и т.д)
видеокарта не умеет рисовать примитивы. Она умеет рисовать только линии и треугольники. Остальное получается из их комбинаций и потоковой обработки пикселей на них (или пикселей экрана, если рендеринг по-пиксельный).
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.10.2017, 18:55
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Потаскайте слайдер…
Если слайдер двигают на малое расстояние то и частота отправки SIGNAL valueChanged (int) малая малый FPS. Если двигают на большое то частота может быть до 80…это какой то индусский код.
в общем разобрался, что вы добиваетесь. В данном случае речь не о переотрисовке виджета, а о обработке виндой движения мыши. А это вещи разные. А для тестирования вами именно перерисовки виджета прикладываю код. И что перерисовки при движении виджета происходят не чаще 7 мс, но обычно гораздо реже (и тут дело не в Qt а в обработке мыши виндой), а собственно перерисовка занимает 0.3 мс (т.е. теоретически может обеспечить fps 3000).

P.S. делал под Qt5.3, так что Для Qt4.8 нужно будет убрать "widgets" из rastr.pro и подшаманить инклуды.
Вложения
Тип файла: rar rastr.rar (2.6 Кб, 4 просмотров)
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
31.10.2017, 19:37  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
нужно будет убрать "widgets" из rastr.pro и подшаманить инклуды.
Настроился сам Qt 4.8.4.

Так вы отключили всю нагрузку…
widget.cpp
C++ (Qt)
1
//  for (int i = 1; i < 10000000; ++i){}
Включаем получаем:

Как сделать чтобы 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
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.10.2017, 20:17
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Как сделать чтобы FPS уменьшились в зависимости сложности вычислений т.е. от времени работы цикла For и были хоть примерно постоянны?
я ж уже говорил - вынести отрисовку (или в данном упрощённом случае цикл) в другой поток. Тогда fps у ГУИ вообще никак не будет зависеть от сложности ваших расчётов, но, естественно, быстрее, чем происходят расчёты, обновление картинки происходить не будет (если конечно не будете возиться с прерыванием расчёта). Если нужен "как бы стабильный fps" между запусками расчётов, используйте этот самый QTimer в упомянутом потоке.

Добавлено через 5 минут
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Включаем получаем:
получаем что перемещения мыши ваша windows XP обрабатывает иногда реже, чем 0.97 секунды. О каком fps может идти речь, если на вашем одноядернике расчёты просаживают всю работу операционной системы?

Добавлено через 14 минут
Хотя можно и вот так (это в общем совпадает с вашим подходом):

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "widget.h"
#include "ui_widget.h"
#include "defs.h"
 
 
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
 
//QObject::connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(render()));
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
 
 
QTimer *timer2 = new QTimer(this);
connect(timer2, SIGNAL(timeout()), this, SLOT(render()));
timer2->start(10);
 
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::update()
{
    qDebug() << "FPS:"<< a;
    a=0;
}
 
void Widget::render()
{
    int slider_pos = ui->horizontalSlider->value();     // отсюда берём текущее положение слайдера вне зависимости как его двигают
    a++;
   for (int i = 1; i < 10000000; ++i){}
}
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
31.10.2017, 21:35  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Хотя можно и вот так
Так делал.

Предлагали также сложней:
Цитата Сообщение от alexu_007 Посмотреть сообщение
по прерыванию таймера получаем данные, выводим на экран, ждём следующего прерывания таймера.
слайдером меняем частоту срабатывания таймера
Хочу адаптивный FPS. Но не понимаю синтаксиса из справки…Чтобы сам задавал когда таймеру вывести кадр.
Вот тут алгоритм
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Нажали слайдер //sliderPressed()
Может отключение слайдера убавит лаги? Или дисконнект слот? Или изменять частоту опроса мышки? (такое доступно?).
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.10.2017, 22:22
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Или изменять частоту опроса мышки?
найди комп с двухядерным процессором, тогда твой зависший на расчётах поток не будет тормозить систему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.10.2017, 22:22
Помогаю со студенческими работами здесь

Прямоугольники: нарисовать, двигать, управлять, удалять
На си шарпе нужно сделать так, чтобы из одного класса я мог создать два прямоугольника, в которых будет отличаться текст. В одном...

Нарисовать заданные фигуры и сделать, чтобы их можно было двигать
нужно написать программу на делфи: с помощью DXDraw Нужно нарисовать такие штучки (только ровные=) ) и чтобы их можно было двигать.

Нарисовать линию
Нарисовать горизонтальную &quot;линию&quot;, состоящую из 15 разноцветных пересекающихся окружностей.

Нарисовать линию
Возникла проблема: ничего не хочет рисоваться на панели. Давно не пользовался свингом, поэтому немного туплю) public class GamePanel...

Нарисовать линию
Привет всем. Почему данный код не рисует линиЮ? package com.exampl1e.tt; import android.content.Context; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
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
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru