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

Qt. QGraphics. Как определить scene

01.09.2014, 09:19. Показов 2730. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста уважаемые гуру программирования..
Имеется следующее: есть класс mainwindow
в заголовочном файле mainwindow.h определена scene типа QGraphicsscene (public)
в файле .cpp создается объект scene = new QGraphicsscene.
Далее создан класс Square одним из методов которого - построение геометрического объекта на этой самой scene,
подскажите пожалуйста как определить scene.
Класс Square по идее унаследован от mainwindow, пытался в базовом прописать QGraphicsscene *scene типа protected, pulic ..вроде компилируется но при запуске - крах..
Подскажите пожалуйста, как лучше решить это??
Заранее огромное спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2014, 09:19
Ответы с готовыми решениями:

Cannot load scene: Invalid scene name (empty string)
Доброе время суток!!! Вообщем проблема в том ,что почему-то возникая такая ошибка(ниже) т.е. я не...

Public Scene scene. Вывести в редактор
Доброго времени. Можно как-то указать нужную мне сцену через инспектор?) 1) public Scene scene...

Cвязь координат QGraphics
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ...

QGraphics. Перехват событий о перемещении Itema
На сцене есть несколько Node элементов (с флагом QGraphicsItem::ItemIsMovable): class Node :...

11
Заблокирован
01.09.2014, 09:35 2
Цитата Сообщение от olegjan Посмотреть сообщение
Класс Square по идее унаследован от mainwindow,
Это что ещё за бред? Тыж понимаешь, что при создание каждого объекта Square у тебя будет MainWidnow заново пересоздаваться, т.к. это базовый класс и его конструктор вызовется.
Тебе нужно твой класс Square наследовать от QGraphicsItem, переопределять в нём paintEvent() рисовать в нём свой квадрат. Добавлять в сцену экземпляр своего класса надо при помощи addItem. Если хочешь на сцене стандартные виджеты рисовать и манипулировать ими - почитай про QGraphicsProxyWidget
1
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
01.09.2014, 09:52 3
Блин! Многабукав а нифига не понять! Лучше бы код выложил!

Я так понимаю, что это попытка написать что-то методом тыка, не читая литературы.
Если присутствует QGraphicsScene, то должен быть и QGraphicsView - который является собственно окном для отображения графики.
А QGraphicsScene - это по сути только контейнер для графических объектов.
В QGraphicsView нужно передать указатель на вашу сцену, через метод QGraphicsView::setScene(QGraphicsScene*),
Либо при создании сцены указать QGraphicsView в качестве родителя.
Цитата Сообщение от olegjan Посмотреть сообщение
Далее создан класс Square одним из методов которого - построение геометрического объекта на этой самой scene
Какой именно метод? Что в нем реализовано? Код в студию!
0
11 / 11 / 1
Регистрация: 14.07.2014
Сообщений: 186
01.09.2014, 10:11  [ТС] 4
mainwindow.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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QGraphicsItem>
#include <QGraphicsScene>
#include <QGraphicsView>
 
namespace Ui {
class MainWindow;
}
class My_scene;
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
 
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
 
};
 
#endif // MAINWINDOW_H
mainwindow.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "mainwindow.h"
#include "my_scene.h"
#include "square.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{    ui->setupUi(this);
 
 
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
my_scene.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef MY_SCENE_H
#define MY_SCENE_H
 
#include "mainwindow.h"
 
 
class My_scene : public QGraphicsItem
{
public:
    My_scene();
    void create_scene();
    QGraphicsItem *item;
    QGraphicsScene *scene;
    QGraphicsView *view;
};
 
#endif // MY_SCENE_H
my_scene.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "my_scene.h"
 
 
My_scene::My_scene()
{
 
}
 
void My_scene::create_scene()
{
    scene = new QGraphicsScene;
    view = new QGraphicsView (scene);
}
square.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef SQUARE_H
#define SQUARE_H
 
#include "my_scene.h"
 
class Square : public My_scene
{
public:
    Square();
    void create();
};
 
#endif // SQUARE_H
sqare.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "square.h"
 
Square::Square()
{
    
}
 
void Square::create()
{
    item = scene->addEllipse(QRectF(10,10,100,100),QPen(Qt::red),QBrush(Qt::blue));
}
Добавлено через 3 минуты
вроде как хочется методом create_scene класса My_scene создавать scene и view, а потом create создать эллипс.
в конструкторе mainwindow.cpp пока ничего не писал ибо не получить очередное
Цитата Сообщение от -NEURON- Посмотреть сообщение
Это что ещё за бред?
))

Добавлено через 5 минут
Цитата Сообщение от alexey_rage Посмотреть сообщение
Я так понимаю, что это попытка написать что-то методом тыка, не читая литературы.
литературу читал - принцип работы QGraphics понимаю, проблема с реализацией того, что понимаю)
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
01.09.2014, 10:26 5
Понятно.
В общем это работать не будет и все нужно делать совсем не так.

Раз вы собираетесь создавать QGraphicsScene и QGraphicsView внутри своего класса My_scene, то не нужно My_scene ни от чего наследовать. Либо наследовать его от QObject, чтобы например была возможность использовать систему сигнал-слот.
Для view нужно вызвать метод view.show(), чтобы окно отобразилось на экране (окно будет отдельное, не внутри MainWindow)
Далее по поводу наследования Square от scene - зачем это? Какой смысл вы хотели в это заложить?
Не проще ли метод create() создать прямо в My_scene?

А если честно, то мне вообще не понятна ваша задумка. Для чего вообще нужен класс My_scene?
Не проще ли все это создать прямо в MainWindow?
Или это какая-то обертка будет или библиотека?

Добавлено через 1 минуту
Цитата Сообщение от olegjan Посмотреть сообщение
проблема с реализацией того, что понимаю)
Если проблема с реализацией, то это как раз означает, что вы не понимаете!
0
11 / 11 / 1
Регистрация: 14.07.2014
Сообщений: 186
01.09.2014, 10:33  [ТС] 6
да в курсе я про view и как его отобразить.
хотел отображать объекты сцены на ui->graphicsView.

Цель программы научиться работать с классами и наследованием, поэтому особой смысловой нагрузки сия тулза не несет.
смысл такой: есть класс my_scene методами которого можно будет поворачивать фигуры созданные другими классами Square, Triangle, Rectangle и менять цвет их заливки.
Соответственно классы Square, Triangle, Rectangle создают квадраты, треугольники и прямоугольники.
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
01.09.2014, 10:48 7
ОК.
Тогда думаю, лучше классы Square, Triangle, Rectangle наследовать от QGraphicsItem.
Нужно будет переопределить методы
C++ (Qt)
1
2
3
    
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
И не забыть подключить
#include <QPainter>

Далее в методах paint каждого из классов реализуем рисования элипса, прямоугольника и треугольника соответственно. А также создаем метод для передачи в класс цвета пера и кисти QPen и QBrush.
Создаем классы фигур в классе My_scene, добавляем их на сцену, через QGraphicsScene::addItem()
Ну и все. Вращение реализовывается через методы:
QGraphicsItem::rotate(qreal angle) - вращение относительно текущего угла поворота.
QGraphicsItem::setRotation(qreal angle) - вращение относительно системы координат.
1
11 / 11 / 1
Регистрация: 14.07.2014
Сообщений: 186
01.09.2014, 14:49  [ТС] 8
Цитата Сообщение от alexey_rage Посмотреть сообщение
ОК.
Тогда думаю, лучше классы Square, Triangle, Rectangle наследовать от QGraphicsItem.
Нужно будет переопределить методы
Код C++ (QT)
1
2
3
QRectF boundingRect() const;
* * void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
И не забыть подключить
#include <QPainter>
Далее в методах paint каждого из классов реализуем рисования элипса, прямоугольника и треугольника соответственно. А также создаем метод для передачи в класс цвета пера и кисти QPen и QBrush.
Создаем классы фигур в классе My_scene, добавляем их на сцену, через QGraphicsScene::addItem()
Ну и все. Вращение реализовывается через методы:
QGraphicsItem::rotate(qreal angle) - вращение относительно текущего угла поворота.
QGraphicsItem::setRotation(qreal angle) - вращение относительно системы координат.

вот спасибо тебе дружище!!)
поюзаю сейчас данные тобой советы)

Добавлено через 3 часа 56 минут
alexey_rage, помоги плиз..

делаю как ты говорил, отдельный класс для создания определенной фигуры, так
square.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Square::Square()
{
 
}
QRectF Square::boundingRect()const{
    return QRectF(0,0,30,30);
}
 
void Square::paint(QPainter *painter,
                 const QStyleOptionGraphicsItem *option,
                 QWidget *widget)
{
    painter->setBrush(Qt::green);
    int xos=rand()%500;
    int yos=rand()%500;
    int length=rand()%100;
    painter->drawRoundedRect(xos,yos,length,length,0,0);
}
пытаюсь вызывать этот метод
если начинаю писать в файле main.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
#include "dialog.h"
#include "square.h"
#include "triangle.h"
 
#include <QApplication>
 
#include <time.h>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    srand(time(NULL));
 
    Dialog w;
 
        QGraphicsView view;
        QGraphicsScene* scene = new QGraphicsScene (0,0,600,600,&view);
        view.setScene(scene);
        scene->setBackgroundBrush(Qt::black);
 
        Square* square = new Square;
        scene->addItem(square);
 
        view.show();
 
    w.show();
 
    return a.exec();
}
все работает, но стоит мне сунуть в какой нибудь метод сам процесс создания
C++ (Qt)
1
2
        Square* square = new Square;
        scene->addItem(square);
то компилятор не понимает что такое scene..
помоги плиз..нервничаю сильно чет..

Добавлено через 47 секунд
alexey_rage, помоги плиз..

делаю как ты говорил, отдельный класс для создания определенной фигуры, так
square.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Square::Square()
{
 
}
QRectF Square::boundingRect()const{
    return QRectF(0,0,30,30);
}
 
void Square::paint(QPainter *painter,
                 const QStyleOptionGraphicsItem *option,
                 QWidget *widget)
{
    painter->setBrush(Qt::green);
    int xos=rand()%500;
    int yos=rand()%500;
    int length=rand()%100;
    painter->drawRoundedRect(xos,yos,length,length,0,0);
}
пытаюсь вызывать этот метод
если начинаю писать в файле main.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
#include "dialog.h"
#include "square.h"
#include "triangle.h"
 
#include <QApplication>
 
#include <time.h>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    srand(time(NULL));
 
    Dialog w;
 
        QGraphicsView view;
        QGraphicsScene* scene = new QGraphicsScene (0,0,600,600,&view);
        view.setScene(scene);
        scene->setBackgroundBrush(Qt::black);
 
        Square* square = new Square;
        scene->addItem(square);
 
        view.show();
 
    w.show();
 
    return a.exec();
}
все работает, но стоит мне сунуть в какой нибудь метод сам процесс создания
C++ (Qt)
1
2
        Square* square = new Square;
        scene->addItem(square);
то компилятор не понимает что такое scene..
помоги плиз..нервничаю сильно чет..
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
01.09.2014, 14:54 9
Цитата Сообщение от olegjan Посмотреть сообщение
то компилятор не понимает что такое scene..
Видимо потому, что не подключен #include <QGraphicsScene>
0
11 / 11 / 1
Регистрация: 14.07.2014
Сообщений: 186
01.09.2014, 15:06  [ТС] 10
да нет конечно, что только уже не инклудил..

я так понимаю если создаешь метод вызова по клику, например
void Dialog::on_create_square_clicked()

как то надо сообщать о том, что scene была ранее создана и все что мы пытаемся нарисовать этим методом, мы хотим это сделать на этой сцене. Самая основная моя проблема в синтаксисе, точнее в отсутствии моего понимания как и куда все это прописать.
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
01.09.2014, 15:17 11
Цитата Сообщение от olegjan Посмотреть сообщение
как то надо сообщать о том, что scene была ранее создана и все что мы пытаемся нарисовать этим методом, мы хотим это сделать на этой сцене. Самая основная моя проблема в синтаксисе, точнее в отсутствии моего понимания как и куда все это прописать.
У вас проблема не в синтаксисе, а в отсутствии понимания принципов ООП.

Ну так а кто мешает при создании диалога передать в него указатель на ранее созданную сцену?
Ну или прилипить к диалогу метод на подобие QGraphicsView::setScene(QGraphicsScene* scene);

При описании класса Dialog объявляем внутри класса указатель на сцену QGraphicsScene* myScene;
В конструкторе класса Dialog зануляем данный указатель myScene = 0;
Когда сцена будет создана, передаем указатель на нее в
класс Dialog.
C++ (Qt)
1
2
3
4
void Dialog::setScene(QGraphicsScene* scene)
{
     if(scene) myScene = scene;
}
Ну а дальше:
C++ (Qt)
1
2
3
4
5
6
7
void Dialog::on_create_square_clicked() 
{
   if(myScene) // Если сцена создана
   {
          Square* square = new Square;
          myScene->addItem(square);
   }
И все дела.
1
11 / 11 / 1
Регистрация: 14.07.2014
Сообщений: 186
02.09.2014, 08:24  [ТС] 12
alexey_rage, Привет) подскажи пожалуйста, а вот там идет проверка создана ли сцена,
то есть если я ее до создаю в конструкторе Dialog способом QGraphicsScene *scene = new QGraphicsScene;
то по идее условие возвратит TRUE??
0
02.09.2014, 08:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2014, 08:24
Помогаю со студенческими работами здесь

Отобразить javafx.scene.image.Image в javafx.scene.layout.GridPane
Подскажите, пожалуйста, как отобразить javafx.scene.image.Image в javafx.scene.layout.GridPane.

JavaFX + Scene Builder как получить значение с TextField
Я только начинаю учить javaFX, поэтому, может это и глупый вопрос, но я запутался. Приложение...

Перемещение камеры, как в редакторе unity в окне Scene
Всем привет! Подскажите, пожалуйста, как реализовать точно такое же перемещение камеры как в самом...

Как конвертировать java.io.File к javafx.scene.image.Image?
Пробую вот такой способ и не выходит. InputStream is = null; try {is = new...


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

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