Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 39
1

Перерисовка графика при изменении размера виджета

04.04.2016, 19:44. Показов 2674. Ответов 4

Author24 — интернет-сервис помощи студентам
Делаю программу, которая должна визуализировать алгоритмы сортировок. Для вывода создал виджет SortGraphic, унаследованный от QGraphicsView. Сначала не использовал PaintEvent, рисовал график через scene в своём методе drawArray(). Но появилась проблема: когда изменяю размер окна, размер виджета также меняется, а размер графика - нет. Пытался засовывать рисование в resizeEvent, затем в paintEvent, в результате получал много предупреждений о рекурсивной перерисовке, иногда форма или отдельные её элементы вообще не загружались... Прочитал где-то про painter, но с ним вообще разобраться не могу, получаю много предупреждений:
C++ (Qt)
1
2
3
4
5
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setBrush: Painter not active
QPainter::setPen: Painter not active
QWidget::repaint: Recursive repaint detected
sortgraphic.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "sortgraphic.h"
#include <QGraphicsScene>
 
SortGraphic::SortGraphic(QWidget *parent) : QGraphicsView(parent)
{
    this->scene = new QGraphicsScene();
    this->setScene(scene);
    defaultPen = new QPen(Qt::red);
    comparePen = new QPen(Qt::blue);
    movePen = new QPen(Qt::green);
}
 
void SortGraphic::setArray(QVector<int> *arr)
{
    this->arr = arr;
    this->update();
}
 
void QSortGraphic::drawArray()
{
    scene->clear();
    if(arr->size())
    {
        int max=arr->first();
        foreach (int x, *arr) {
            if(x>max) max=x;
        }
        for(int i=0;i<arr->size();i++ )
        {
            scene->addLine(0,(this->height()/arr->size())*i,(this->width()/max)*arr->at(i),(this->height()/arr->size())*i,*defaultPen);
        }
    }
}
 
void SortGraphic::paintEvent(QPaintEvent *event)
{
    QPainter *painter = new QPainter(this);
    painter->setBrush(Qt::SolidPattern);
    painter->setPen(*defaultPen);
    if(arr->size())
    {
        int max=arr->first();
        foreach (int x, *arr) {
            if(x>max) max=x;
        }
        for(int i=0;i<arr->size();i++ )
        {
            painter->drawLine(0,(this->height()/arr->size())*i,(this->width()/max)*arr->at(i),(this->height()/arr->size())*i);
        }
    }
}
sortgraphic.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#ifndef SORTGRAPHIC_H
#define SORTGRAPHIC_H
 
#include <QWidget>
#include <QGraphicsView>
#include <QVector>
#include <QPen>
#include <QGraphicsScene>
 
class SortGraphic : public QGraphicsView
{
    Q_OBJECT
public:
    explicit SortGraphic(QWidget *parent);
    void setArray(QVector<int> *arr);
 
private:
    QVector<int> *arr;
    QGraphicsScene *scene;
    int linewidth;
    QPen *defaultPen;
    QPen *comparePen;
    QPen *movePen;
protected:
    virtual void paintEvent(QPaintEvent *event);
signals:
 
public slots:
    void drawArray();
//    void swap(int a, int b);
//    void move(int from, int to);
//    void copy(int from, int to);
//    void compare(int min, int max);
//    void set(int pos, int value);
 
 
};
 
#endif // SORTGRAPHIC_H
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "sortgraphic.h"
#include <QVector>
#include <random>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_StartStop1_clicked()
{
    QVector<int> *arr = new QVector<int>();
    for(int i=1;i<50;i++) arr->append(i);
    ui->Gr1->setArray(arr);
}
Вложения
Тип файла: rar SortThreads.rar (9.5 Кб, 7 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2016, 19:44
Ответы с готовыми решениями:

Перерисовка окна при изменении размера
Наверняка вопрос популярный, но найти пока не смогла. Киньте ссылкой, если есть. Начинаю только...

Qml изменение размера Canvas при изменении размера окна
Может есть какой нибудь способ, чтобы при изменении размера окна (в моем случае window) изменялся...

Перерисовка объектов, при изменении размера окна
Всем доброго времени суток, такая проблема, надо, чтобы при изменении масштаба окна,...

Не работает перерисовка pictureBox при изменении размера
Не работает перерисовка pictureBox при изменении размера. Точнее не работает если изменять размер с...

4
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
05.04.2016, 18:36 2
А для чего тебе QGraphicsView? Если рисуешь с помощью QPainter, то наследуй от QWidget, рисование - в paintEvent(), который при изменении размеров вызывается автоматически. И память освобождай, если всё на указателях делаешь.
0
0 / 0 / 0
Регистрация: 30.01.2016
Сообщений: 7
05.04.2016, 21:01 3
Используй в ResizeEvent функции QGraphicsView::scale и QGraphicsView::setSceneRect . Еще можно изменять размер сцены с помощью QGraphicsView::setMatrix
0
Заблокирован
05.04.2016, 23:47 4
ТС, у тебя в архиве половины файлов нет из того, что должно быть
SOURCES += main.cpp\
mainwindow.cpp \
sort.cpp \
sortthread.cpp \
bubblesort.cpp \
sortthreadcontroller.cpp \
sortgraphic.cpp

HEADERS += mainwindow.h \
sort.h \
sortthread.h \
sorttypes.h \
bubblesort.h \
sortthreadcontroller.h \
sortgraphic.h
Делай нормальный архив, тогда посмотрю
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 39
06.04.2016, 10:42  [ТС] 5
Решил проблему сам: метод отрисовки через scene поместил в resizeEvent, косяк был с тем, что resizeEvent вызывался до инициализации вектора, добавил проверку на существование вектора - и всё работает. Всё, что пытался делать с QPainter, удалил.
0
06.04.2016, 10:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2016, 10:42
Помогаю со студенческими работами здесь

Перерисовка внутри окна при изменении размера
Подскажите, когда начинаю менять размер окна с помощью мышки - тяну за угол, само окно становится...

Отображение графика при изменении размера формы в OpenGL
График зачастую &quot;съедает&quot; при растягивании/сжатии формы.(см. вложения). Ниже код события изменения...

Графика в Pascal: сохранение траектории при изменении размера экрана
Сохранение траектории при изменении размер экранаuses graphabc; ****************************...

Перерисовка при изменении размеров формы
Доброго утра! Я рисую несколько прямоугольников в случайном местоположении и случайного размера....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru