Приветствую.
Речь пойдёт о таком интересном и мало описанном элементе Qt как QGraphicsView.
Статьи будут писаться по мере нахождения у меня времени и продвижения программы, на примере которой я и собираюсь показать как надо использовать QGraphicsView.
1) Создание сцены, view. Размещение стандартных элементов. Работа с элементами.
2) Создание собственного элемента. Работа с собственным элементом. Создание редактора свойств.
3) Взаимодействие элементов. Создание связи между двумя элементами.
4) ?.
Итак начнём.
1) Создание сцены, view. Размещение стандартных элементов. Работа с элементами.
Создание сцены, view. Размещение стандартных элементов.
Работа с элементами.
Чтобы начать работать нам необходимы три компонента.
QGraphicsScene - scene или модель, которая хранит данные и работает с ними.
QGraphicsView - view или элемент интерфейса, отображающий данные модели. Он является графическим компонентов и именно с ним работает пользователь.
QGraphics*Item - стандартные компоненты, которые могут быть помещены в scene и отображены view.
Для начала создаём проект Qt. Назовём его Graphics-lesson_1.
Переходим в graphics-lesson_1.h файл.
Добавляем инклуды:
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsLineItem>
Добавляем приватные поля нашему классу:
QGraphicsLineItem * lineItem_;
QGraphicsScene * scene_;
QGraphicsView * view_;
Так же добавляем приватный метод
void initUI();
Переходим в graphics-lesson_1.cpp файл.
В конструктор класса добавляем строку
initUi();
Пишем реализацию метода
void Graphics_lesson_1::initUI()
{
// создаём scene
scene_ = new QGraphicsScene;
// создаём view, делаем его центральным виджетом и устанавливаем сцену
view_ = new QGraphicsView();
setCentralWidget(view_);
view_->setScene(scene_);
// создаём объект линии и добавляем его в сцену.
lineItem_ = new QGraphicsLineItem(0,0, 250,250);
scene_->addItem(lineItem_);
}
Компилируем. Запускаем. Видим линию на белом фоне и ничего мы поделать с ней не можем.
Потому добавляем в метод iniUi в конец следующий строки
// разрешаем передвигать и выделять линию.
lineItem_->setFlag(QGraphicsItem::ItemIsMovable, true);
lineItem_->setFlag(QGraphicsItem::ItemIsSelectable, true);
Компилируем. Запускам. Теперь мы можем выделять и передвигать наш объект. Работа с другими стандартными объектами не отличается. Спасибо за внимание.
Архив
Код
graphics_lesson_1.cpp
#include "graphics_lesson_1.h"
Graphics_lesson_1::Graphics_lesson_1(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
initUI();
}
Graphics_lesson_1::~Graphics_lesson_1()
{
}
void Graphics_lesson_1::initUI()
{
// создаём scene
scene_ = new QGraphicsScene;
// создаём view, делаем его центральным виджетом и устанавливаем сцену
view_ = new QGraphicsView();
setCentralWidget(view_);
view_->setScene(scene_);
// создаём объект линии и добавляем его в сцену.
lineItem_ = new QGraphicsLineItem(0,0, 250,250);
scene_->addItem(lineItem_);
// разрешаем передвигать и выделять линию.
lineItem_->setFlag(QGraphicsItem::ItemIsMovable, true);
lineItem_->setFlag(QGraphicsItem::ItemIsSelectable, true);
}
graphics_lesson_1.h
#ifndef GRAPHICS_LESSON_1_H
#define GRAPHICS_LESSON_1_H
#include <QtGui/QMainWindow>
#include "ui_graphics_lesson_1.h"
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsLineItem>
#include <QPushButton>
class Graphics_lesson_1 : public QMainWindow
{
Q_OBJECT
public:
Graphics_lesson_1(QWidget *parent = 0, Qt::WFlags flags = 0);
~Graphics_lesson_1();
private:
Ui::Graphics_lesson_1Class ui;
QGraphicsLineItem * lineItem_;
QGraphicsScene * scene_;
QGraphicsView * view_;
private:
void initUI();
};
#endif // GRAPHICS_LESSON_1_H
main.cpp
#include "graphics_lesson_1.h"
#include <QtGui/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Graphics_lesson_1 w;
w.show();
return a.exec();
}