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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Масштабирование и прокрутка графиков по отдельности  (Прочитано 11989 раз)
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« : Август 15, 2017, 14:14 »

Мне нужно отобразить несколько графиков в одном окне. Надо иметь возможность масштабировать и прокручивать графики по отдельности. Для отображения одного графика использую QGLWidget. А как теперь лучше отобразить графики вместе? На ум приходит положить несколько QGLWidget (в каждом нарисован свой график) с прозрачным фоном друг на друга. Или лучше использовать сцену с графическим представлением? Или что-то еще? Посоветуйте...
« Последнее редактирование: Август 15, 2017, 20:22 от Bolonat » Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #1 : Август 21, 2017, 19:45 »

В результате на сцену кладу массив виджетов QOpenGLWidget с прозрачным фоном и размер каждого устанавливаю равным размеру формы. Все хорошо, графики отображаются, но при растягивании формы масшабирование виджетов выполняется скачками  Грустный.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #2 : Август 21, 2017, 21:30 »

Не пойму, как тут прозрачный фон помогает...
QLayout уже не модно ? Улыбающийся
Записан

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 не волк, в лес не уйдёт
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #3 : Август 22, 2017, 11:52 »

Не пойму, как тут прозрачный фон помогает...
QLayout уже не модно ? Улыбающийся
Проблема в том, что при использовании QLayout  мне не удалось установить прозрачность виджета QOpenGLWidget , он отображается с черным фоном, хоть ты тресни. А вот если виджеты поместить на сцену, то прозрачность есть.
Я работаю в Qt три недели, возможно чего-то еще не понимаю, поэтому заранее прошу меня извинить за все глупости. Улыбающийся
Мои графики имеют несколько сотен тысяч значений, занимают всю область окна и пересекаются друг с другом во множестве мест. Перерисовать отдельную область не получится. Поэтому изначально хотелось реализовать систему слоев, чтобы работать с каждым графиком отдельно в своем слое(масштабировать, изменять промежутки отображения) и не перерисовывать остальные. Задача поставлена реализовать в OpenGL. Поэтому и использую виджеты QOpenGLWidget с прозрачным фоном.  Прозрачность устанавливаю с помощью
Код:
setWindowOpacity(0.9); 
в конструкторе и
  
Код:
  QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
    f->glClearColor(0, 0, 0, 0);
в initializeGL().
Еще одна проблема - масштабирование всего окна приводит к скачкообразному масштабированию всех слоев - виджетов. После многочисленных экспериментов прихожу к выводу, что проблема в  QOpenGLWidget. Если взять и положить простые виджеты QWidget друг на друга:
Код:
chart::chart(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::chart)
{
    ui->setupUi(this);

    //Создаем первый виджет
    QWidget* topWidget=new QWidget(this);

    //layout, который кладется на само диалоговое окно
    QVBoxLayout* curLayout=new QVBoxLayout;
    curLayout->addWidget(topWidget);
    setLayout(curLayout);

    //layout, который кладется на первый виджет
    curLayout=new QVBoxLayout;
    topWidget->setLayout(curLayout);


    for (int i = 0; i<10; i++)
    {
        //Создать очередной виджет
        QWidget* w=new QWidget(this);
        topWidget=w;
        curLayout->addWidget(w);

        //Назначить виджету фон
        QPalette pall;
        pall.setColor(w->backgroundRole(), Qt::blue);
        w->setPalette(pall);
        w->setAutoFillBackground(true);

        //Создать на виджете layout
        curLayout=new QVBoxLayout;
        w->setLayout(curLayout);
    }
}

chart::~chart()
{
    delete ui;
}
Масштабирование окна выполняется идеально. Но если в этом же коде заменить QWidget на QOpenGLWidget то при масштабировании уже можно заметить скачкообразность и фон остается черным. А если заменить на QGLWidget, то при масштабировании эффект вас потрясет... Улыбающийся

 
« Последнее редактирование: Август 22, 2017, 12:06 от Bolonat » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #4 : Август 22, 2017, 12:05 »

Мне нужно отобразить несколько графиков в одном окне. Надо иметь возможность масштабировать и прокручивать графики по отдельности. Для отображения одного графика использую QGLWidget. А как теперь лучше отобразить графики вместе? На ум приходит положить несколько QGLWidget (в каждом нарисован свой график) с прозрачным фоном друг на друга. Или лучше использовать сцену с графическим представлением? Или что-то еще? Посоветуйте...
Ничего не понял? Вам графики нужны рядом или друг над другом? И зачем виджеты поверх друг друга рисовать если можно в одном виджете отрисовать?
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #5 : Август 22, 2017, 12:10 »

Ничего не понял? Вам графики нужны рядом или друг над другом? И зачем виджеты поверх друг друга рисовать если можно в одном виджете отрисовать?
То есть, считаете, перерисовать 30 графиков с 200 тыс точек в каждом при изменении одного, это нормально?   
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 22, 2017, 12:32 »

То есть, считаете, перерисовать 30 графиков с 200 тыс точек в каждом при изменении одного, это нормально?  
Считаю что да, нормально, на то и OpenGL/GPU. А можно и без него, буферирование никто  не отменял. А вот затея "каждый график в своем окне" явно нездоровая (и ненужная). Все рисуется в одном окне, но есть список графиков где можно из выбрать, включить, выключить
« Последнее редактирование: Август 22, 2017, 12:34 от Igors » Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #7 : Август 22, 2017, 13:05 »

Считаю что да, нормально, на то и OpenGL/GPU. А можно и без него, буферирование никто  не отменял. А вот затея "каждый график в своем окне" явно нездоровая (и ненужная). Все рисуется в одном окне, но есть список графиков где можно из выбрать, включить, выключить
Отлично! Рисую все графики в одном виджете QOpenGlWidget. Проблема с масштабированием остается. Тяну вправо край формы на 5 см и почти спустя секунду восстанавливается изображение.
Код:
void chart::resizeEvent(QResizeEvent* pe)
{
    ui->myGraphicsView->resize(width(),height());
    w->resize(ui->myGraphicsView->width(), ui->myGraphicsView->height());
}
Здесь w - это QOpenGLWidget.
А что такое буферирование? Где почитать?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Август 22, 2017, 13:38 »

Отлично! Рисую все графики в одном виджете QOpenGlWidget. Проблема с масштабированием остается.
Так для QOpenGlWidget нужно resizeGL (а не resizeEvent)
А что такое буферирование? Где почитать?
Рисуете каждый гоафик в своем буфере (QImage), а потом шлепаете все буфера в окно. А если с OpenGL то лучше использовать VBO (по сути тоже буфер)

Также графики могут иметь разный иасштаб по Y. Стандартные решения: опция "AutoScale" - выбранные графики автоматом вписываются по Y. И также "Custom Scale" число, отображается в списке графиков. Напр если юзер установил Custom Scale = 2, то данный график будет рисоваться в 2 раза больше по Y (чтобы быть соразмеримым с остальными)
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #9 : Август 22, 2017, 13:46 »

Так для QOpenGlWidget нужно resizeGL (а не resizeEvent)
Само собой! Оно присутствует в каждом QOpenGlWidget... Но без resizeEvent для окна-контейнера  при масштабировании изображение остается прямоугольником в центре, а по краям образуются пустые поля(Это поскольку виджеты элементы сцены, они не масштабируются автоматически).

Цитировать
Рисуете каждый график в своем буфере (QImage), а потом шлепаете все буфера в окно. А если с OpenGL то лучше использовать VBO (по сути тоже буфер)
Также графики могут иметь разный иасштаб по Y. Стандартные решения: опция "AutoScale" - выбранные графики автоматом вписываются по Y. И также "Custom Scale" число, отображается в списке графиков. Напр если юзер установил Custom Scale = 2, то данный график будет рисоваться в 2 раза больше по Y (чтобы быть соразмеримым с остальными)
Спасибо, покопаю в эту сторону...

Если убрать сцену, граф. представление, resizeEvent и просто положить QOpenGLWidget с QLayout на форму, то ведет себя лучше при масштабировании.
« Последнее редактирование: Август 24, 2017, 13:28 от Bolonat » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Август 22, 2017, 14:28 »

Это поскольку виджеты элементы сцены, они не масштабируются автоматически
Ну вот со сценой/айтемами и разбирайтесь. Кстати не вижу зачем она здесь.
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #11 : Август 22, 2017, 14:40 »

Если бы с самого начала направили в нужное русло, не пришлось бы всякую ерунду городить...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #12 : Август 23, 2017, 11:57 »

А пчму бы просто Qwt не использовать?
Записан

ArchLinux x86_64 / Win10 64 bit
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #13 : Август 24, 2017, 07:12 »

А пчму бы просто Qwt не использовать?
Лицензия не подходит. Нужна LGPL. Да и медленная она...
« Последнее редактирование: Август 24, 2017, 08:33 от Bolonat » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #14 : Август 24, 2017, 11:22 »

Цитировать
цензия не подходит. Нужна LGPL

http://qwt.sourceforge.net/qwtlicense.html

LOL, А там что, не LGPL с поблажками?

Цитировать
Да и медленная она...

LOOOL!  Смеющийся

Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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