BACEK АМамыр 9, 2016, 11:16 Т.Ж.

Вопрос по QGraphicsScene и QGraphicsView – перерисовка объектов

qgraphicsscene, QGraphicsView, QHash, QMap, Qt

Доброго вам времени суток,
Работая с QGraphicsScene, возникает необходимость отображать большое количество однотипных элементов (item’ов) – порядка миллионов квадратов (rectangle’ов 7х7 ). Их прорисовка(scene->addRect) и удаление(scene->removeItem) занимает слишком большое кол-во времени, а она происходит периодически, скажем 0,3 сек . Вопрос, как можно было бы это оптимизировать?
У меня есть мысль прорисовывать только те, что находятся в видимой части сцены. Ну может с каким-то запасом. А передвигаясь в “новые области” дорисовывать оставшиеся. Проблема как узнать координаты видимой части QGraphicsScene или QGraphicsView ?
Если у вас есть другие мысли по поводу оптимизации этой задачи, буду рад услышать.
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

37
Evgenii Legotckoi
  • Мамыр 9, 2016, 11:48 Т.Ж.

Их прорисовка(scene->addRect) и удаление(scene->removeItem) занимает слишком большое кол-во времени, а она происходит периодически, скажем 0,3 сек

Добавление и удаление элементов в принципе довольно дорогостоящий процесс при таком раскладе будет. Нужно действительно оптимизировать эту часть. Но у меня вопрос: “А зачем это сделано именно таким образом? Для чего удалять и добавлять элементы для обновления? Если я правильно понял, то здесь происходит периодическое удаление всех элементов с графической сцены их создание и добавление на графическую сцену. Может лучше проверять объекты на предмет того, а стоит ли удалять эти объекты, если они там должны остаться”

А определить, какая часть графической сцены видна в данный момент можно следующим образом:

ui->graphicsView->mapToScene(QRect(0, 0,
                                   ui->graphicsView->viewport()->width(),
                                   ui->graphicsView->viewport()->height()));

В данном случае будет возвращён объект QPolygonF, который будет представлять собой прямоугольник, четыре вершины которого будут представлены в координатах графической сцены. Ну а потом можно определить, какие из item`ом лежат внутри этой области и уже работать с ними.

    • Мамыр 9, 2016, 2:22 Т.Қ.
    Спасибо за graphicsView->mapToScene. А что насчет объектов, то удаляются и добавляются не все, а только те, что необходимы в данный момент, но из-за их огромного количества приходится прибегать к “ухищрениям”.
      iG
      • Мамыр 9, 2016, 2:43 Т.Қ.
      А можно пример того, что должно получиться в результате.
        • Мамыр 10, 2016, 3:04 Т.Қ.
        Если интересует код программы, то там и половины нет, позже, когда завершу, могу выложить.
          • Мамыр 10, 2016, 3:33 Т.Қ.
          Да уж, чем дальше в лес, толще партизаны.
          Сейчас у меня три следующих вопроса:
          1) Какой слот/сигнал необходимо использовать чтобы следить за изменением размера и/или координат (двигаясь при помощи слайд баров) scene, чтобы потом выводить изображение в нужную часть окна?
          2) При помощи какого параметра можно остановить все изменения(добавления и удаления) на scene, если изменяется ее размер или происходит движение(при помощи слайдбара)?
          2) ui->graphicsView->mapToScene(QRect(0, 0,
          ui->graphicsView->viewport()->width(),
          ui->graphicsView->viewport()->height()));

          при запуске программы почему-то инициализируется каким-то произвольным размером 0,0:98,28, хотя и размеры окна и scene уже заданы, да и сделав проверку на запущенной программе получаю -300,-200 : 300,200. Конечно истинные значения можно ручками вбить, но хотелось бы разобраться.
          П.С. Спасибо за новый урок по QThread, жду продолжения. Буду свои основные вычисления разделять на потоки по количеству ядер процессора, для ускорения вычислений.
            iG
            • Мамыр 10, 2016, 4:04 Т.Қ.

            Если интересует код программы то там и половины нет, позже, когда завершу, могу выложить.

            Не код, а задача. в зависимости от нее можно предложить патерны для оптимизации. возможно частично или вообще отказаться от qt graphics классов.

              • Мамыр 10, 2016, 4:18 Т.Қ.

              Если интересует код программы то там и половины нет, позже, когда завершу, могу выложить.

              Не код, а задача. в зависимости от нее можно предложить патерны для оптимизации. возможно частично или вообще отказаться от qt graphics классов.

              задача заключается в следующем: необходимо довольно быстро(в секунду 2-10 раз) добавлять и убирать большое количество одинаковых квадратиков(желательно миллион) с очень большого поля (что-вроде игры жизнь). На QGraphicsScene addRect и removeItem идут довольно долго, поэтому приходится исхитрятся- добавлять только на видимую часть сцены. Если предложите что-то более быстрое и оптимальное буду очень благодарен.

                Evgenii Legotckoi
                • Мамыр 10, 2016, 11:14 Т.Қ.

                Какой слот/сигнал необходимо использовать чтобы следить за изменением размера и/или координат (двигаясь при помощи слайд баров) scene, чтобы потом выводить изображение в нужную часть окна?

                Можно использовать сигнал изменения позиции скроллбаров.

                MainWindow::MainWindow(QWidget *parent) :
                    QMainWindow(parent),
                    ui(new Ui::MainWindow)
                {
                    ui->setupUi(this);
                    scene = new QGraphicsScene();
                    scene->setSceneRect(0,0,500,500);
                    ui->graphicsView->setScene(scene);
                    connect(ui->graphicsView->horizontalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollSlot);
                    connect(ui->graphicsView->verticalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollSlot);
                }
                 
                MainWindow::~MainWindow()
                {
                    delete ui;
                }
                 
                void MainWindow::scrollSlot()
                {
                    ui->graphicsView->mapToScene(QRect(0,0,
                                                       ui->graphicsView->viewport()->width(),
                                                       ui->graphicsView->viewport()->height()));
                }

                2) При помощи какого параметра можно остановить все изменения(добавления и удаления) на scene, если изменяется ее размер или происходит движение(при помощи слайдбара)?

                А вот здесь уже не в параметре дело, а в том, какой Вы для этого алгоритм напишите. У вас же этот процесс связан, наверняка, с каким-нибудь таймером или иным флагом по работе с игровым объектами. Вот по нему и стартуйте, и останавливайте работу программы. Как вариант, могу предложить посмотреть цикл статей на тему написания простой игры. Смотрите ту часть кода, где идёт работа с игровым таймером.

                P/S/ по QThread была самая базовая статья. Это не самый кошерный способ по работе с потоками, поскольку правильнее его использовать для расширения функционала класса. Чуть позже будут ещё статьи на эту тему.

                  • Мамыр 11, 2016, 3:31 Т.Ж.

                  А вот здесь уже не в параметре дело, а в том, какой Вы для этого алгоритм напишите. У вас же этот процесс связан, наверняка, с каким-нибудь таймером или иным флагом по работе с игровым объектами. Вот по нему и стартуйте, и останавливайте работу программы. Как вариант, могу предложить посмотреть цикл статей на тему написания простой игры. Смотрите ту часть кода, где идёт работа с игровым таймером.

                  Этот принцип мне понятен. Вы правильно предположили, что здесь имеет место таймер, но изменение на сцене будут происходить в каком-то “долгом” цикле, где:
                  1)Необходимо мониторить какой-то параметр изменения размера/положения сцены, вопрос какой это мог бы быть параметр?
                  2)Как быть если получен положительный результат этого параметра(происходят изменения сцены), как остановить “долгий” цикл и продолжить его после стабилизации сцены?

                    • Мамыр 11, 2016, 3:35 Т.Ж.
                    Я тут думаю, может мне по совету ilopix‘a действительно поискать какой-то другой вариант отображения. Как понимаю добавление итемов на сцену занимает много времени и ресурсов. Не подскажите, нет ли возможности работать не с объектами, а изменять сцену(или что-то другое) рисуя на ней (вроде битмапа). А удаление производить восстанавливая оригинальный цвет (или перезарисовывая)?
                      Evgenii Legotckoi
                      • Мамыр 11, 2016, 12:17 Т.Қ.

                      1)Необходимо мониторить какой-то параметр изменения размера/положения сцены, вопрос какой это мог бы быть параметр?

                      Так я же уже ответил примером кода. В том примере отслеживаются скроллбары, изменение положение графической сцены в graphicsView как раз и можно отслеживать теми слотами. Изменение размера графической сцены можно отслеживать по изменению размера окна, допустим.

                      2)Как быть если получен положительный результат этого параметра(происходят изменения сцены), как остановить «долгий» цикл и продолжить его после стабилизации сцены?

                      Ну вот здесь вопрос поинтереснее получается. Я пока даже не знаю, как бы я это сделал. Возможно, послать сигнал на остановку процесса пересчёта квадратиков. Дать завершиться текущей итерации цикла, а потом перерисовать сцену. Кстати, сам расчёт квадратиков имеет смысл делать на какой-нибудь матрице, которая будет транслироваться на графическую сцену. Я не смотрел алгоритм той игры, но полагаю, что примерно так это и происходит там.

                      Как понимаю добавление итемов на сцену занимает много времени и ресурсов.

                      1) Добавлять и удалять на графической сцене только те итемы, которые находятся в видимой части;
                      2) Не пересоздавать те итемы, которые остались на месте в текущей итерации после предыдущей итерации;
                      3) Посмотреть в сторону OpenGL – это может помочь увеличить производительность.

                        • Мамыр 12, 2016, 3:33 Т.Ж.

                        1) Добавлять и удалять на графической сцене только те итемы, которые находятся в видимой части;

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

                        2) Не пересоздавать те итемы, которые остались на месте в текущей итерации после предыдущей итерации;

                        Этот совет уже применен.

                        3) Посмотреть в сторону OpenGL — это может помочь увеличить производительность.

                        Видимо придется пробовать, но к сожалению пока не нашел “подходящих” примеров, а если использовать те что есть, придется переделывать весь интерфейс программы.

                        Кстати, сам расчёт квадратиков имеет смысл делать на какой-нибудь матрице, которая будет транслироваться на графическую сцену.

                        Боюсь что матрица не очень подходит. При размерах поля, например 1000 000 на 1000 000 придется работать с ~100GB массивом. Я применил другой метод, который не зависит от величины поля, а только от количества “живых” клеток на нем.(если интересно код прилагается). При малом количестве клеток все ОК, но при большом затягивается их добавление и стирание, что тормозит программу. А также проявляется странный эффект если подвигать скрол вверх-вниз, не удаляются некоторые пиксели.

                        Возможно, послать сигнал на остановку процесса пересчёта квадратиков. Дать завершиться текущей итерации цикла, а потом перерисовать сцену.

                        Вот это и проблема, можно ввести какую-нибудь bool переменную, которая останавливала бы изменения на сцене, но как ею управлять? Включить можно при помощи подсказанных вами слотов или по изменению окна, но как выключить? (Хотя интуиция мне подсказывает что должен быть какой-нибудь параметр для QGraphicsScene или View останавливающий изменения на сцене при внешних манипуляциях)

                        gameoflife_new.zip

                          Evgenii Legotckoi
                          • Мамыр 12, 2016, 9:31 Т.Ж.

                          А Вы случаем не пробовали запускать в режиме Выпуска, а не Отладки? Скорость сама по себе достаточно неплохо у приложения возрастает. Для начала так проверили бы. Также подтормаживают работу приложения всякие qDebug().

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

                          Я так понял из приложения, что хеш таблица не сортированная получается. Жаль. Так бы можно было просто поиском с половинным делением находить крайние точки в хеш таблице и перебирать уже только нужную область.

                          Боюсь что матрица не очень подходит. При размерах поля, например 1000 000 на 1000 000 придется работать с ~100GB массивом.

                          Ну да. Что-то я лиханул.

                          Вот это и проблема, можно ввести какую-нибудь bool переменную, которая останавливала бы изменения на сцене, но как ею управлять?

                          У Вас же таймер есть в программе. Его и останавливайте на время обработки изменения размеров. А что касается артефактов, то, по моему, это и не артефакты, а неправильно создавшиеся item’ы что ли. scene->update() просто их не убирает, хотя обычно это позволяет удалить артефакты. Видимо, это item`ы создавшиеся некорректно при передвижении сцены. Таким образом, их координаты центральные отличаются от тех, что имеются в хеш таблице, поэтому и не получается их удалить. Они просто становятся не отслеживаемыми.

                            • Мамыр 12, 2016, 1:50 Т.Қ.

                            А Вы случаем не пробовали запускать в режиме Выпуска, а не Отладки? Скорость сама по себе достаточно неплохо у приложения возрастает. Для начала так проверили бы. Также подтормаживают работу приложения всякие qDebug().

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

                            Я так понял из приложения, что хеш таблица не сортированная получается. Жаль. Так бы можно было просто поиском с половинным делением находить крайние точки в хеш таблице и перебирать уже только нужную область.

                            А вот это уже интересно. Разве всякие хеш таблицы и мапы при своем заполнении сразу не упорядочиваются? Насколько я понимаю именно это свойство и является их отличием от векторов, списков(list) и т.п.. И разве в них для этих целей в них специально не созданы функции вроде contains и find, которые производят быстрый поиск, и неужели им нужна дополнительная сортировка? Если да, то походу я лоханулся. Тогда получается лучше работать с каким-нибудь вектором или вообще простым динамическим массивом, только перед писком сортировать или лучше пробовать хеш сортировать, как вы считаете? (Кстати, посмотрел описание- там пишут что хеш произволен, а мап упорядочен. Однако у меня с хешем вычисления быстрее шли, странно).

                            У Вас же таймер есть в программе. Его и останавливайте на время обработки изменения размеров.

                            Но ведь таймер запускает “долгие” функции добавления и удаления и если я его остановлю они-то не остановятся. Мне кажется, что останавливать необходимо именно эти функции. Только я ни как не могу придумать как это реализовать. Есть идея создать напр. переменную bool stopChanges которая получала true при (…->verticalScrollBar(), &QScrollBar::valueChanged) и останавливала бы эти функции (можно и таймер), но как ее вернуть в false, когда уже будет можно включить остановленные функции?

                            Видимо, это item`ы создавшиеся некорректно при передвижении сцены. Таким образом, их координаты центральные отличаются от тех, что имеются в хеш таблице, поэтому и не получается их удалить. Они просто становятся не отслеживаемыми.

                            Очень похоже что здесь вы, как всегда, правы, я думаю это еще один мотив использовать остановку изменений на сцене при ее движении.

                              Evgenii Legotckoi
                              • Мамыр 13, 2016, 4:05 Т.Ж.

                              Кстати, посмотрел описание- там пишут что хеш произволен, а мап упорядочен. Однако у меня с хешем вычисления быстрее шли, странно

                              Не было возможности подробно вдаваться в особенности QHash и QMap, но тоже глянул документацию. Да, QMap в отличие от QHash сортируется. Но в той же документации сказано, что QHash быстрее в плане поиска. Там иной алгоритм применяется. Так что, похоже, что ничего странного в этом нет.
                              Можно попробовать использовать QMap вместо QHash, но с одним нюансом. Поскольку QMap сортируется по ключу (в данном случае это будет скорее всего X координата), то использовать граничные координаты видимой области, чтобы не перебирать весь QMap. То есть нашли координату первой линии, и прошлись итератором до конца этой линии, вместо того, чтобы делать поиск find/contains каждого объекта, а потом нашли координату второй линии и т.д. до последней линии. Возможно, получится выиграть некоторые ресурсы по времени.

                              Есть идея создать напр. переменную bool stopChanges

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

                                • Мамыр 13, 2016, 11:08 Т.Ж.

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

                                А альтернативное решение не подскажите? ни как не могу остановить изменения на сцене.

                                  Evgenii Legotckoi
                                  • Мамыр 14, 2016, 2:20 Т.Қ.

                                  А альтернативное решение не подскажите? ни как не могу остановить изменения на сцене.

                                  Могу предложить глянуть новую статью по потокам в Qt приложении. Посмотрите внимательно на использование переменной m_running. Думаю, что примерно таким же образом Вам нужно будет выскакивать из цикла в Ваших долгих функциях, не дожидаясь отрисовки оставшихся объектов.

                                    • Мамыр 15, 2016, 5:26 Т.Ж.

                                    Посмотрите внимательно на использование переменной m_running. Думаю, что примерно таким же образом Вам нужно будет выскакивать из цикла в Ваших долгих функциях, не дожидаясь отрисовки оставшихся объектов.

                                    Спасибо за урок по потокам. Что-то вроде переменной m_running я и собираюсь использовать. Только у меня опять не разрешенная задача, я знаю как включить(true) ее в начале перед запуском потока (при нажатии кнопки или при запуске програмы), знаю как ее выключить(false) (…->verticalScrollBar(), &QScrollBar::valueChanged) и остановить поток, но как продолжить поток когда сцена стабилизируется? Не нажимать же для этого Старт кнопку каждый раз когда поскролю сцену. Ни как не могу придумать условие или найти слот, чтобы ее автоматически включить (m_running=true);

                                      Evgenii Legotckoi
                                      • Мамыр 15, 2016, 5:44 Т.Ж.
                                      Ну. Если под стабилизацией понимать изменение размеров или перемещение видимой области, то можно воспользоваться дополнительным таймером, который будет запускаться при возникновении события изменения данных параметров графической сцены и соответственно обновляться каждый раз при изменении. Когда сцена стабилизируется, то возобновлять отрисовку. Это, конечно, костыль уже, но пока ничего другого предложить не могу.
                                        • Мамыр 15, 2016, 12:21 Т.Қ.

                                        connect(ui->graphicsView->horizontalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollSlot);
                                        connect(ui->graphicsView->verticalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollSlot);

                                        Я очень извиняюсь, но у меня ни как не получается воплотить вышеуказанный вами код. Постоянно кидает ошибку:
                                        C:\…\mainwindow.cpp:33: error: no matching function for call to ‘MainWindow::connect(QScrollBar*, const char*, MainWindow*, const char*)’
                                        connect(ui->graphicsView->horizontalScrollBar(),SIGNAL(&QScrollBar::valueChanged()),this ,SLOT(&MainWindow::scrollSlot()));
                                        Что-то не так с ui->graphicsView->horizontalScrollBar() и его сигналом. Я перепробовал все возможные варианты этой записи, но ни как. Не подскажите? Со scrollSlot() все в порядке, другими сигналами он прекрасно запускается. К стати я кажется придумал как мне выкрутиться с остановкой и запуском сцены: QScrollBar вместе с valueChanged() наследует sliderPresssed() и sliderReleased(). Если получиться с первым, то должно и с другими, но пока что ни как не получается.
                                        П.С. разобрался с “артефактами” образующимися при движении окна. graphicsView имеет свойство viewportUpdateMode::BoundinrRectViewportUpdate с помощью его параметров такие вещи как раз устраняются.

                                          Evgenii Legotckoi
                                          • Мамыр 15, 2016, 12:29 Т.Қ.

                                          Что-то не так с ui->graphicsView->horizontalScrollBar() и его сигналом.

                                          Во-первых, удостоверьтесь, что на месте строка #include <QScrollBar>
                                          Во-вторых, очистить полностью проект от последней сборки, лучше вообще удалить папку build. Смахивает на то, что таблица сигналов и слотов не полная. Запуск qmake может и не помочь. Так что удалить build и пересобрать заново.

                                            iG
                                            • Мамыр 15, 2016, 12:39 Т.Қ.
                                            connect(ui->graphicsView->horizontalScrollBar(), SIGNAL(valueChanged(int)), SLOT(scrollSlot()));
                                              iG
                                              • Мамыр 15, 2016, 12:42 Т.Қ.
                                              От графической сцены так и не отказался?
                                                • Мамыр 15, 2016, 12:47 Т.Қ.

                                                От графической сцены так и не отказался?

                                                Даже не представляю каким еще образом можно отобразить много “квадратиков” на большом поле в Qt.

                                                  • Мамыр 15, 2016, 12:51 Т.Қ.

                                                  Во-первых, удостоверьтесь, что на месте строка #include <QScrollBar>

                                                  Спасибо помогло, а я перелопатил всю документацию по QScrollBar. Видимо я сегодня заработался.

                                                    iG
                                                    • Мамыр 15, 2016, 12:55 Т.Қ.
                                                    берешь QPainter
                                                    увеличиваешь масштаб вьюпорта в 7 раз
                                                    рисуешь
                                                      Evgenii Legotckoi
                                                      • Мамыр 15, 2016, 12:56 Т.Қ.

                                                      Даже не представляю каким еще образом можно отобразить много «квадратиков» на большом поле в Qt.

                                                      OpenGL )))
                                                      Я бы сам им позанимался, но пока нет желания, поскольку других дел валом, и нужно иногда отдыхать от Qt.

                                                        Evgenii Legotckoi
                                                        • Мамыр 15, 2016, 12:57 Т.Қ.

                                                        Во-первых, удостоверьтесь, что на месте строка #include <QScrollBar>

                                                        Спасибо помогло, а я перелопатил всю документацию по QScrollBar. Видимо я сегодня заработался.

                                                        Вообще, я до конца не был уверен, что это поможет, потому что обычно другую ошибку в этом случае выдаёт.

                                                          iG
                                                          • Мамыр 15, 2016, 1:01 Т.Қ.

                                                          Даже не представляю каким еще образом можно отобразить много «квадратиков» на большом поле в Qt.

                                                          OpenGL )))
                                                          Я бы сам им позанимался, но пока нет желания, поскольку других дел валом, и нужно иногда отдыхать от Qt.

                                                          QPainter вполне может справить

                                                            • Мамыр 15, 2016, 1:05 Т.Қ.

                                                            Я думал о QPainter е, но не нашел нормальных примеров: как его вставить в graphicsVew, как настроить взаимодействие с мышкой. Без примеров трудновато.

                                                            увеличиваешь масштаб вьюпорта в 7 раз

                                                            К сожалению, эта информация мне пока еще ни чего не говорит.

                                                              iG
                                                              • Мамыр 15, 2016, 1:26 Т.Қ.
                                                              • Жауап шешім ретінде белгіленді.

                                                              Исходя из того насколько я понял задачу.
                                                              вот пример отображение 1 000 000 обьектов, совершенно без оптимизации.
                                                              считаю что нужно смотреть в эту сторону, если по_работать с оптимизацией, можно обработать уйму сложных обьектов (с анимацией и логикой) при условии создания своей сцены которая будет обрабатывать обьекты в потоках (преимущество только для многоядерных cpy)
                                                              если лень писать свою обработку. можно использовать Qt сцену немного поработав с View интегрировав туда масштабирование – будет быстро но не гибко.
                                                              Может через пару часиков попробую смастерить что то подобное.

                                                              Заранее извиняюсь если где то ошибся потому что не читал весь пост.

                                                              scrollbarwidget.zip

                                                                Evgenii Legotckoi
                                                                • Мамыр 15, 2016, 1:35 Т.Қ.

                                                                Исходя из того насколько я понял задачу.
                                                                вот пример отображение 1 000 000 обьектов, совершенно без оптимизации.

                                                                Ну может и без оптимизации, но в качестве вывода используется OpenGL.
                                                                Я про строку setViewport(new QGLWidget(this));

                                                                  • Мамыр 15, 2016, 1:46 Т.Қ.
                                                                  Спасибо большое за пример. Здесь явно быстрее. Но я, к сожалению, в Qt еще новичок и некоторые вещи в вашем примере не до конца понятны. А так же:
                                                                  1) как построить взаимодействие с мышью, чтобы при нажатии на поле появлялся или исчезал “квадратик”?
                                                                  2) да и интерфейс, блин, не ясно как закинуть.
                                                                    iG
                                                                    • Мамыр 15, 2016, 2:13 Т.Қ.
                                                                    void Widget::mouseReleaseEvent(QMouseEvent *e)
                                                                    {
                                                                        float fix = m_scale/2.f;
                                                                        m_obj.append(QPoint((e->x()+fix+horizontalScrollBar()->value())/m_scale,
                                                                                            (e->y()+fix+verticalScrollBar()->value())/m_scale));
                                                                        viewport()->update();
                                                                    }

                                                                     

                                                                      • Мамыр 15, 2016, 3:04 Т.Қ.
                                                                      Как все быстро и просто, спасибо.
                                                                      А QPainter только на виджетах рисует или им можно и в graphicsView? А то мне сейчас с интерфейсом чуть не понятно.
                                                                        iG
                                                                        • Мамыр 15, 2016, 3:57 Т.Қ.
                                                                        graphicsView это тоже виджет
                                                                          • Мамыр 15, 2016, 4:49 Т.Қ.
                                                                          Не подскажите как QPainter закинуть в graphicsView.

                                                                            Пікірлер

                                                                            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                                                            Кіріңіз немесе Тіркеліңіз
                                                                            Г

                                                                            C++ - Тест 001. Первая программа и типы данных

                                                                            • Нәтиже:66ұпай,
                                                                            • Бағалау ұпайлары-1
                                                                            t

                                                                            C++ - Тест 001. Первая программа и типы данных

                                                                            • Нәтиже:33ұпай,
                                                                            • Бағалау ұпайлары-10
                                                                            t

                                                                            Qt - Тест 001. Сигналы и слоты

                                                                            • Нәтиже:52ұпай,
                                                                            • Бағалау ұпайлары-4
                                                                            Соңғы пікірлер
                                                                            G
                                                                            GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                                                                            Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                                                                            d
                                                                            dblas5Шілде 5, 2024, 11:02 Т.Ж.
                                                                            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                                            k
                                                                            kmssrАқп. 8, 2024, 6:43 Т.Қ.
                                                                            Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                                                            АК
                                                                            Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                                                                            Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                                                            Енді форумда талқылаңыз
                                                                            Evgenii Legotckoi
                                                                            Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                                                                            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                                                            F
                                                                            FynjyШілде 22, 2024, 4:15 Т.Ж.
                                                                            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                                                                            BlinCT
                                                                            BlinCTМаусым 25, 2024, 1 Т.Ж.
                                                                            Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                                                                            BlinCT
                                                                            BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                                                                            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                                                                            Evgenii Legotckoi
                                                                            Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                                                                            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                                                                            Бізді әлеуметтік желілерде бақылаңыз