Russian Qt Forum
Март 28, 2024, 18:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: работа с QGraphicsScene  (Прочитано 20093 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #15 : Сентябрь 22, 2016, 16:54 »

Я имею в виду QWidget::paint().
У вас логика слишком специфичная - надо быстро обновлять данные, которые приходят с внешнего устройства.
Сцена тут не особо поможет, так как она для другого придумана (скорее, редакторы делать).
Поэтому я бы делал отдельный виджет, который бы, в зависимости от выставленного зума, отображал бы только часть данных. Все равно полный пакет 65к на 32к в видимую область не влезет)
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
deefox
Гость
« Ответ #16 : Сентябрь 23, 2016, 09:20 »

Я имею в виду QWidget::paint().
У вас логика слишком специфичная - надо быстро обновлять данные, которые приходят с внешнего устройства.
Сцена тут не особо поможет, так как она для другого придумана (скорее, редакторы делать).
Поэтому я бы делал отдельный виджет, который бы, в зависимости от выставленного зума, отображал бы только часть данных. Все равно полный пакет 65к на 32кв видимую область не влезет)

вот  такой то пакет и влезает. в видмую часть(при минимальном зуме(он же по умолчанию))

Просто если использовать те же самые QImage,и точно так же добавлять по координатам Widget, я возможно столкнуть с той же бедой при удалении и смещении. Работа с гуями в основном потоке, что то делать в них может и не затратно, но грузит сам интерфейс.

Вырисовывать сразу в виджет уже пытался(с самого начала), гуя просто становился мертвым.

я уж не знаю, что еще можно приудумать.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #17 : Сентябрь 23, 2016, 10:48 »

Не надо ничего добавлять. Данные пакуем в один огромный QImage. Он создается 1 раз и так и остается жить.
Далее переносим в видимую область окна (виджета) только то, что в нее помещается.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
deefox
Гость
« Ответ #18 : Сентябрь 23, 2016, 12:19 »

Не надо ничего добавлять. Данные пакуем в один огромный QImage. Он создается 1 раз и так и остается жить.
Далее переносим в видимую область окна (виджета) только то, что в нее помещается.


Но новые данные то будут приходить и приходить, если видимой области будет не достаточно, вы хотите сказать чтобы там дальше была картика, даже если размером свыше 200 к пикселей?

данные приходят постояно, и мы постоянно пакуем их в QImage (не однократно).

На примере камеры можно  это выразить, вы начали смотреть на точку -  и идете смещать камеру по горизонтали x+: левая часть уходит, а справа что то добавляется, при этом нужно зумировать. и что то нарисовать на нужном месте(треугольник, линию, квадрат).

видимая нами часть получается по умолчанию не как обычно 1 к 1, а 1 к 0.22xxx, то есть размер, при которой ось y помещается полностью а ось x уж как получится, и все это в градиенте серого(ну r g b  одного значения).

Смогу ли я вашим методом все это сделать?
« Последнее редактирование: Сентябрь 23, 2016, 12:23 от deefox » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #19 : Сентябрь 23, 2016, 16:16 »

Ну, какой длины быть картинке, это Вам решать, сколько данных Вы хотите видеть.
Всегда можно паковать новые данные в конец, а если их слишком много, удалять первую строку.
В принципе, тут можно и списком обойтись, QList<QByteArray> или что-то вроде этого - каждый элемент соответствует одной строке данных.
При отрисовке берете последние N строк (например) и рисуете на виджете.
Про камеру вообще ничего не понял. Строки как "идут"? вертикально или горизонтально?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Сентябрь 24, 2016, 03:38 »

"Пытался для экономии сделать через undexed8, но работать стала хуже, поэтому использую формат QImage RGB32"
Что-то не так делали, задумка сократить в 4 раза объем данных была хорошей

Про камеру вообще ничего не понял.
Аналогично. Тут бы картинками показать - может и больше бы людей ответило. А так трудно въехать, шо за "линии" Непонимающий
Записан
Bepec
Гость
« Ответ #21 : Сентябрь 24, 2016, 10:17 »

Похоже на водопад.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #22 : Сентябрь 24, 2016, 13:46 »

ну я так понял, что это штука должна строить график по времени.
новые данные пришли - проскроллилось на 1 вертикальную линию - старые затерлись.
какой-нибудь сейсмологический логгер, или что то вроде этого.
но сцена тут точно не решение, только своя отрисовка...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
deefox
Гость
« Ответ #23 : Сентябрь 26, 2016, 09:39 »

ну я так понял, что это штука должна строить график по времени.
новые данные пришли - проскроллилось на 1 вертикальную линию - старые затерлись.
какой-нибудь сейсмологический логгер, или что то вроде этого.
но сцена тут точно не решение, только своя отрисовка...

ну что то похожее на график, но там картинка

сами линии, которые приходят по сети -  вертикальные. Но по сути камеру двигаем только вправо.
Просто режима 3, если под все 3 режима 1 картинка, то будет очень много не использованного простравнтсва, это первое, с чем я боюсь с толкнуться, 2 - это если нам нужно справо место под линию, то нужно сместить 2080000000 элементов в лево, каждый по 4 байта(попытаюсь все таки на 1 перейти).


Т.Е. каждая линия на данный момент это Qimage(вертикальная), но эта линия создается из нарезок приходящих по езернету в 1318 байт.

Похоже на водопад.

ага, только не вниз, а вправо

 Примерно так:
P.S. каждый квадратик 4096 x 4096




« Последнее редактирование: Сентябрь 26, 2016, 09:42 от deefox » Записан
deefox
Гость
« Ответ #24 : Сентябрь 26, 2016, 11:37 »

Что-то не так делали, задумка сократить в 4 раза объем данных была хорошей

скорее всего так и есть.
Я  немного не пойму суть использования QImage::bits.

Если его делать через:

Код:
imagePixelMode1 = reinterpret_cast<uint *>(curQImageMode1.bits());
То нормально, только заливка белая не работает, но получается что все равно один пиксель 4 байта

а если так: imagePixelMode1 представить как учар, то картинка становится как урезанная.
задаю цвет:
Код:
imagePixelMode1[i] = qGray(data[i],data[i],data[i]);

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Сентябрь 26, 2016, 16:25 »

Пример (писал прямо здесь, возможны ошибки)
Код
C++ (Qt)
QImage CreateImage( const QVector<char> & src, int w, int h )
{
QImage img(w, h, QImage::Format_Indexed8);
 
static QVector<QRgb> colorTable;
if (!colorTable.size()) {
 colorTable.resize(256);
 for (int i = 0; i < 256; ++i)
  colorTable[i] = qRgba(i, i, i, 255);
}
img.setColorTable(colorTable);
 
for (int y = 0; y < h; ++y)
   memmove(img.scanLine(y), &src[0] + y * w, w);
 
return img;
}
При этом w * h <= src.size() или вставлять доп проверки
« Последнее редактирование: Сентябрь 27, 2016, 10:50 от Igors » Записан
deefox
Гость
« Ответ #26 : Сентябрь 27, 2016, 09:44 »

Пример (писал прямо здесь, возможны ошибки)

Код:
for (int y = 0; y < h; ++y) {
   uchar * dst = img.scanLine(y);
   for (int y = 0; y < h; ++y)
    memmove(dst, &src[0] + y * w, w);
 }


Не совсем понимаю значение этих строк(я не работал еще тесно с функциями памяти)?

можно ли использовать не scanLine  а bits? на данный момент (хотя может изменится) в строке всего 1 пиксель.
не совсем разобрался. какой из этих методов лучше.
я так понял. что scanLine сделан для упрощения навигации по строкам. Верно?

по поводу присвоения. как использовать таблицу не через setPixel, а через прямой доступ (scanLine, bits)?
судя из

QImage also provide the scanLine() function which returns a pointer to the pixel data at the scanline with the given index, and the bits() function which returns a pointer to the first pixel data (this is equivalent to scanLine(0)).

я верно понимаю, что после присвоения таблицы, я просто в uchar кладу индекс, присвоенной таблицы?

Код:
uchar * dst = img.bits();
for(int i = 0; i < 4096; i++)
dst[i] = data(i); // data(i) - массив с данными пикселей. принятый по ethernet



Попробовал на практике.

результат -


Код:
    curQImageMode1 = QImage(1,4098,QImage::Format_Indexed8);
    static QVector<QRgb> colorTable;
    if (!colorTable.size()) {
        colorTable.resize(256);
        for (int i = 0; i < 256; ++i)
            colorTable[i] = qRgb(i, i, i);
    }

    curQImageMode1.setColorTable(colorTable);

        imagePixelMode1 = curQImageMode1.bits();
        for(int i = 0; i < 4096; i++)
        {imagePixelMode1[i] = 255;
        }

      //Дальше каждому байту присвавиваем индекс
 imagePixelMode1[i] = data[i];



« Последнее редактирование: Сентябрь 27, 2016, 10:15 от deefox » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #27 : Сентябрь 27, 2016, 10:45 »

scanline(i) возвращает поинтер на строку i картинки, по сути на массив точек строки.
Строки не обязательно лежат в памяти подряд, поэтому надо так:

for (int i = 0; i < image.height(); i++)
{
  uchar* sptr = image.scanLine(i);
  ...
  sptr[0] = 0xff;  // пишем в первый пиксель строки ff
  ...
}
« Последнее редактирование: Сентябрь 27, 2016, 11:03 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #28 : Сентябрь 27, 2016, 10:53 »

Для чего это странное приведение к char? Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #29 : Сентябрь 27, 2016, 11:03 »

Для чего это странное приведение к char? Улыбающийся

по памяти писал.. подумал, что оно void* возвращает...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 23.