Форум программистов, компьютерный форум, киберфорум
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
C12H22O11
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 37
#1

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

11.05.2015, 23:29. Просмотров 1009. Ответов 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 создание нескольких объектов (C++ Qt):

Мерцание при отрисовке объектов на QGraphicsView - C++ Qt
Здравствуйте! Делаю арканоид и возникла проблема, суть которой можно понять из прикрепленного рисунка. На скринах этого не видно, а...

QML. Динамическое создание объектов - C++ Qt
Доброго времени суток, форумчане! Только начинаю разбираться с QML и возник следующий вопрос: Каким образом можно динамически добавлять...

Анимация "затухания" нескольких объектов - C++ Qt
Здравствуйте, необходимо плавно затушить несколько объектов разом в частности QLabel и QLineEdit. Делаю так: ...

Создание нескольких 3D используя openGL - C++ Qt
Добрый вечер! Вначале код скину. Данный код рисует 3D сферу и дает возможность ее вращать и зумить. pro file QT += core gui...

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

QThread, создание нескольких потоков - C++ Qt
Как создать несколько потоков одного класса? У меня есть класс MyThread class MyThread : public QThread { Q_OBJECT public:...

9
alexey_rage
589 / 389 / 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
589 / 389 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
12.05.2015, 07:26 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Просто создавать с сцену один раз в конструкторе класса 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
589 / 389 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
12.05.2015, 15:22 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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 Кб, 1 просмотров)
alexey_rage
589 / 389 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
13.05.2015, 00:15 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
Привет! Вот еще темы с ответами:

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

QGraphicsView - C++ Qt
Как добиться того что бы QGraphicsView автоматически изменял свой размер в соответствии с размером сцены?

QGraphicsView sizeIncrement - C++ Qt
У меня не получается изменять размер QGraphicsView инкрементно на 20. main.cpp #include <QApplication> #include <QGraphicsView> ...

Отрисовка на QGraphicsView - C++ Qt
Доброго времени суток. Есть необходимость рисовать именно на QGraphicsView. Рисунок - прямоугольник, должен уметь: 1. изменять свои...


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

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

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