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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qgrapphics scene  (Прочитано 5559 раз)
deefox
Гость
« : Сентябрь 07, 2016, 10:07 »

 Добрый день.

Подскажите пожалуйста. Идет прием в одном потоке, обработка во втором. Принимаются множество "пакетов" и из них собирается картинка, больших размеров.

QGraphicsView и QGraphicsScene находятся в основном потоке, и  при добавлении элементов идет притормаживание основного потока (GUI), а если сцена в потоке обработки, то отображается лишь при изменении матрицы(scale).

Нужно для того, чтобы во время отрисовки еще что нибудь делать в гуи.

Поджскажите как лучше сделать, чтобы и  гуи не тормозила, и чтобы нормально все отрисовыфвало
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



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

От потока идут сигналы с помощью которых и заполняется сцена?
Вообще, лучше предоставьте код -- проще будет ориентироваться Улыбающийся
Записан

deefox
Гость
« Ответ #2 : Сентябрь 07, 2016, 10:15 »

От потока идут сигналы с помощью которых и заполняется сцена?
Вообще, лучше предоставьте код -- проще будет ориентироваться Улыбающийся

Устанавливаем сцену:
Код:
        viewmap->setScene(asio->imagethread->scene_thread);

и пытаемся рисовать:

Код:
            //Отрисовываем пакет
            for (int i = 0; i < 46; ++i) {
                curQImage.setPixel(0,i+(1318*3),qRgb(data[i],data[i],data[i]));
            }
            //Отправляем конечно линию на отрисовку в виджет
            //                        emit setLine (numLine,curQImage);
            pixItem =  scene_thread->addPixmap(QPixmap::fromImage(curQImage));
            pixItem->setPos(numLine,0);

Так отрисовывает только при изменении матрица(в данном случае при scale)

иначе да, идет сигнал с картинкой в поток виджета, где добавляли в сцену, но гуи лагает


Код:
            //Отрисовываем пакет
            for (int i = 0; i < 46; ++i) {
                curQImage.setPixel(0,i+(1318*3),qRgb(data[i],data[i],data[i]));
            }
            //Отправляем конечно линию на отрисовку в виджет
            emit setLine (numLine,curQImage);


и отрисовываем

Код:
viewMap::setLine(quint16 numLine, QImage itemPixmap)
{

    //    qDebug() << "Новая картинка";
        QGraphicsPixmapItem *it =  scene->addPixmap(QPixmap::fromImage(itemPixmap));
        it->setPos(numLine,0);

        QFuture<void> fute =  QtConcurrent::run(this,setValueScroll);

}

ps. во втором случае QGraphicsScene создается прямо в классе QGraphicsView, и там же добавляется на view
\
Код:
        scene = new QGraphicsScene();
        this->setScene(scene);
« Последнее редактирование: Сентябрь 07, 2016, 10:19 от deefox » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

Отрисовка через слоты Непонимающий
Вот и причина, батенька, вот и причина...
Записан

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
Гость
« Ответ #4 : Сентябрь 07, 2016, 10:55 »

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

А добавлять напрямую в другом потоке в сцену(минуя слоты), проблема с  отображением, всякие UpdateScene пробовал, но чет не вышло
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

еще и setPixel к тому же Грустный
используйте QImage::scanLine вместо этого, иначе тормозов не избежать.

Записан

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
Гость
« Ответ #6 : Сентябрь 07, 2016, 11:22 »

еще и setPixel к тому же Грустный
используйте QImage::scanLine вместо этого, иначе тормозов не избежать.




Ну мне приходит скажем массив пикселей, и их нужно отрисовать. Через FromData не получилось.

Ну в любом случае тормозит он побочный поток, проблема именно в сцене.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Коли используется масштабирование, то не стоит пользоваться QPixmap (QGraphicsPixmapItem), т.к. при отрисовке они будут всё равно преобразованы в QImage.
Создавайте свои айтемы и храните в них QImage и уже их сами отрисовывайте.

Мало того, если все эти заморочки нужны для отрисовки одного большого "лоскутного одеяла", т.е. других элементов сцены не будет, то выбор QGraphicsScene/QGraphicsView совсем не оптимальное решение.
« Последнее редактирование: Сентябрь 07, 2016, 11:26 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
deefox
Гость
« Ответ #8 : Сентябрь 07, 2016, 11:39 »

Коли используется масштабирование, то не стоит пользоваться QPixmap (QGraphicsPixmapItem), т.к. при отрисовке они будут всё равно преобразованы в QImage.
Создавайте свои айтемы и храните в них QImage и уже их сами отрисовывайте.

Мало того, если все эти заморочки нужны для отрисовки одного большого "лоскутного одеяла", т.е. других элементов сцены не будет, то выбор QGraphicsScene/QGraphicsView совсем не оптимальное решение.

Я про то, что можно хранить Qimage в обычном итеме не нашел, только в pixmap(наверно где то не там смотрю)
Я отрисовываю полоски   4к, 16к, 32к пикселей. помимо этого нужно маштабировать, вертеть крутить, и еще рисовать там же. Самое удобное это QGraphicsView(так как есть инструменты для всего что мне нужно).

Но если есть что получше, буду рад услышать  Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

А зачем отдельно отрисовывать полоски  Непонимающий
Храните один большой (или несколько больших) QImage и уже его отрисовайте.
Полоски из других потоков отсылайте в головной и уже в нём "сшивайте одеяло".
Отрисовывать его можно в QGraphicsView/QGraphicsScene::drawBackground().
Записан

Qt 5.11/4.8.7 (X11/Win)
deefox
Гость
« Ответ #10 : Сентябрь 07, 2016, 12:07 »

А зачем отдельно отрисовывать полоски  Непонимающий
Храните один большой (или несколько больших) QImage и уже его отрисовайте.
Полоски из других потоков отсылайте в головной и уже в нём "сшивайте одеяло".
Отрисовывать его можно в QGraphicsView/QGraphicsScene::drawBackground().

Чтобы создать одну большую картинку, требуется очень много оперативной памяти.
 на практике картинку 4000x4000 отрисовал:
по полоскам за 300мсек
блоками карнок по 1024х1024 за 900
(с учетом передачи по  UDP)
А создавать QImage 4кx4к, после сборки, прога минуту грузилась

Там еще так получается, что положение полоски будет задаваться заголовком пакета, и не совсем ясно, будет ли 2 полоска, или сразу 50, которая будет рисоваться горизонтально
Записан
Tamori Nao
Гость
« Ответ #11 : Сентябрь 07, 2016, 12:30 »

У Боровского Qt 4.7 стр 298 есть пример вывода и чтения больших изображений, возможно пригодится.
Записан
deefox
Гость
« Ответ #12 : Сентябрь 07, 2016, 13:00 »

У Боровского Qt 4.7 стр 298 есть пример вывода и чтения больших изображений, возможно пригодится.

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

Но вопрос не решен, как мне работу со сценой убрать из основного потока, но что бы отображение велось корректно?
« Последнее редактирование: Сентябрь 07, 2016, 14:36 от deefox » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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