Russian Qt Forum

Qt => Вопросы новичков => Тема начата: deefox от Сентябрь 07, 2016, 10:07



Название: Qgrapphics scene
Отправлено: deefox от Сентябрь 07, 2016, 10:07
 Добрый день.

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

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

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

Поджскажите как лучше сделать, чтобы и  гуи не тормозила, и чтобы нормально все отрисовыфвало


Название: Re: Qgrapphics scene
Отправлено: gil9red от Сентябрь 07, 2016, 10:09
От потока идут сигналы с помощью которых и заполняется сцена?
Вообще, лучше предоставьте код -- проще будет ориентироваться :)


Название: Re: Qgrapphics scene
Отправлено: deefox от Сентябрь 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);


Название: Re: Qgrapphics scene
Отправлено: Racheengel от Сентябрь 07, 2016, 10:40
Отрисовка через слоты ???
Вот и причина, батенька, вот и причина...


Название: Re: Qgrapphics scene
Отправлено: deefox от Сентябрь 07, 2016, 10:55
Отрисовка через слоты ???
Вот и причина, батенька, вот и причина...
Почему же, отрисовка через слоты, при небольшом количестве элементов довольно таки нормальная, но при большой количестве очень не нормально.

А добавлять напрямую в другом потоке в сцену(минуя слоты), проблема с  отображением, всякие UpdateScene пробовал, но чет не вышло


Название: Re: Qgrapphics scene
Отправлено: Racheengel от Сентябрь 07, 2016, 11:07
еще и setPixel к тому же :(
используйте QImage::scanLine вместо этого, иначе тормозов не избежать.



Название: Re: Qgrapphics scene
Отправлено: deefox от Сентябрь 07, 2016, 11:22
еще и setPixel к тому же :(
используйте QImage::scanLine вместо этого, иначе тормозов не избежать.




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

Ну в любом случае тормозит он побочный поток, проблема именно в сцене.


Название: Re: Qgrapphics scene
Отправлено: GreatSnake от Сентябрь 07, 2016, 11:23
Коли используется масштабирование, то не стоит пользоваться QPixmap (QGraphicsPixmapItem), т.к. при отрисовке они будут всё равно преобразованы в QImage.
Создавайте свои айтемы и храните в них QImage и уже их сами отрисовывайте.

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


Название: Re: Qgrapphics scene
Отправлено: deefox от Сентябрь 07, 2016, 11:39
Коли используется масштабирование, то не стоит пользоваться QPixmap (QGraphicsPixmapItem), т.к. при отрисовке они будут всё равно преобразованы в QImage.
Создавайте свои айтемы и храните в них QImage и уже их сами отрисовывайте.

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

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

Но если есть что получше, буду рад услышать  :)


Название: Re: Qgrapphics scene
Отправлено: GreatSnake от Сентябрь 07, 2016, 11:58
А зачем отдельно отрисовывать полоски  ???
Храните один большой (или несколько больших) QImage и уже его отрисовайте.
Полоски из других потоков отсылайте в головной и уже в нём "сшивайте одеяло".
Отрисовывать его можно в QGraphicsView/QGraphicsScene::drawBackground().


Название: Re: Qgrapphics scene
Отправлено: deefox от Сентябрь 07, 2016, 12:07
А зачем отдельно отрисовывать полоски  ???
Храните один большой (или несколько больших) QImage и уже его отрисовайте.
Полоски из других потоков отсылайте в головной и уже в нём "сшивайте одеяло".
Отрисовывать его можно в QGraphicsView/QGraphicsScene::drawBackground().

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

Там еще так получается, что положение полоски будет задаваться заголовком пакета, и не совсем ясно, будет ли 2 полоска, или сразу 50, которая будет рисоваться горизонтально


Название: Re: Qgrapphics scene
Отправлено: Tamori Nao от Сентябрь 07, 2016, 12:30
У Боровского Qt 4.7 стр 298 есть пример вывода и чтения больших изображений, возможно пригодится.


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

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

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