Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
C12H22O11
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 37
1

QGraphicsView создание нескольких объектов

11.05.2015, 23:29. Просмотров 1186. Ответов 9
Метки нет (Все метки)

Суть проблемы: не могу создать 2 и более объектов.

При нажатии на кнопку [AddEllipse] на QGraphicsView рисуется круг,я переместил этот круг куда надо и хочу нарисовать 2-ой круг, но не получается.
При повторном нажатии на кнопку, круг перемещается в центр QGraphicsView и всё,т.е. 2-ой круг не рисуется.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Widget::on_pushButton_clicked()
{   //AddEllipse
    QGraphicsScene *scene = new QGraphicsScene;
    ui->graphicsView->setScene(scene);
    QPen Pen_1 (Qt::black);
    QBrush Brush_1 (Qt::gray);
    Pen_1.setWidth(3);
    int d=70;
    int x,y;
    x = ui->XspinBox_2->value();
    y = ui->YspinBox_3->value();
    Ellipse = scene->addEllipse(x,y,d,d,Pen_1,Brush_1);
    Ellipse -> setFlag(QGraphicsItem::ItemIsMovable);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2015, 23:29
Ответы с готовыми решениями:

Мерцание при отрисовке объектов на QGraphicsView
Здравствуйте! Делаю арканоид и возникла проблема, суть которой можно понять...

QML. Динамическое создание объектов
Доброго времени суток, форумчане! Только начинаю разбираться с QML и возник...

Анимация "затухания" нескольких объектов
Здравствуйте, необходимо плавно затушить несколько объектов разом в частности...

QThread, создание нескольких потоков
Как создать несколько потоков одного класса? У меня есть класс MyThread class...

Создание нескольких 3D используя openGL
Добрый вечер! Вначале код скину. Данный код рисует 3D сферу и дает...

9
alexey_rage
591 / 391 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
12.05.2015, 00:04 2
Все у вас рисуется.
Только в новой сцене.

Вот здесь:
C++ (Qt)
1
2
    QGraphicsScene *scene = new QGraphicsScene;
    ui->graphicsView->setScene(scene);
вы каждый раз по нажатию кнопки создаете новую сцену и устанавливаете ее в QGraphicsItem.
Соответственно и новый эллипс рисуется в новой сцене, а старая сцена больше не отрисовывается, но хранится в памяти. Поэтому у вас еще и утечка памяти в наличии.
1
C12H22O11
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 37
12.05.2015, 05:23  [ТС] 3
А как сделать так, чтобы круги рисовались в одной сцене? или как можно решить мою проблему?
0
alexey_rage
591 / 391 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
12.05.2015, 07:26 4
Лучший ответ Сообщение было отмечено C12H22O11 как решение

Решение

Просто создавать с сцену один раз в конструкторе класса Widget
C++ (Qt)
1
2
    scene = new QGraphicsScene;
    ui->graphicsView->setScene(scene);
Перенесите этот код в конструктор виджета.

Только объявление указателя на сцены лучше сделать в хедере.
QGraphicsScene *scene;
1
C12H22O11
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 37
12.05.2015, 14:22  [ТС] 5
Спасибо, помогло.
И ещё проблема, что нужно настроить, чтобы бы при рисовании круга, QGraphicsView не изменялся(ширина и высота),а то при размещении круга по краям, появляются scrollbar`ы
0
alexey_rage
591 / 391 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
12.05.2015, 15:22 6
Лучший ответ Сообщение было отмечено C12H22O11 как решение

Решение

Цитата Сообщение от C12H22O11 Посмотреть сообщение
И ещё проблема, что нужно настроить, чтобы бы при рисовании круга, QGraphicsView не изменялся(ширина и высота),а то при размещении круга по краям, появляются scrollbar`ы
C++ (Qt)
1
2
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1
C12H22O11
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 37
12.05.2015, 15:42  [ТС] 7
Спасибо большое
0
C12H22O11
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 37
12.05.2015, 22:23  [ТС] 8
alexey_rage,
Ещё раз прошу у Вас помощи
Итак:
1) нарисовал 1 круг, переместил его,добавил 2ой круг и начал его перемещать, и почему-то 1ый круг тоже начал перемещаться(самопроизвольно).
2) При установки координат x=1,y=1 круг устанавливается в левой части( по середине) GraphicsView.
Что нужно сделать, чтобы координаты считались с левого нижнего угла?(рис 1.)


Заранее спасибо за ответ
0
Миниатюры
QGraphicsView создание нескольких объектов  
Вложения
Тип файла: rar Project.rar (831.1 Кб, 3 просмотров)
alexey_rage
591 / 391 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
13.05.2015, 00:15 9
Лучший ответ Сообщение было отмечено C12H22O11 как решение

Решение

Цитата Сообщение от C12H22O11 Посмотреть сообщение
2) При установки координат x=1,y=1 круг устанавливается в левой части( по середине) GraphicsView.
Что нужно сделать, чтобы координаты считались с левого нижнего угла?(рис 1.)
Вы просто не задали размеры сцены. У вас сцена по умолчанию ширину и высоту равные нулю.
Соответственно координата (1, 1) у вас и получается в центре GraphicsView.

Для того, чтобы работало корректно нужно установить область сцены:
C++ (Qt)
1
2
3
// Устанавливаем сцену в левый верхний угол GraphicsView
// и задаем ширину и высоту сцены равными ширине и высоте GraphicsView
scene->setSceneRect(0, 0, ui->graphicsView->width(), ui->graphicsView->height());
Но этот код нужно вызывать только после того, как отработал конструктор MainWindow.
До этого момента все виджеты имеют нулевой размер.

Добавлено через 1 минуту
Цитата Сообщение от C12H22O11 Посмотреть сообщение
1) нарисовал 1 круг, переместил его,добавил 2ой круг и начал его перемещать, и почему-то 1ый круг тоже начал перемещаться(самопроизвольно).
Х.З. Разбирайтесь со своими указателями.
Каким образом происходит перемещение круга?
0
C12H22O11
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 37
13.05.2015, 19:32  [ТС] 10
alexey_rage, 1) проблема решилась после правильной установки координат,т.е. то, что вы предложили
C++ (Qt)
1
2
3
// Устанавливаем сцену в левый верхний угол GraphicsView
// и задаем ширину и высоту сцены равными ширине и высоте GraphicsView
scene->setSceneRect(0, 0, ui->graphicsView->width(), ui->graphicsView->height());
0
13.05.2015, 19:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2015, 19:32

Создание нескольких однотипных QLabel
Здравствуйте. Создал 10 QLabel как показано ниже. Подскажите пожалуйста...

QGraphicsView
Как добиться того что бы QGraphicsView автоматически изменял свой размер в...

QGraphicsView
Здравствуйте, я только еще учу Qt и с++, подскажите в где мои ошибки пытаюсь...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru