Qt - tworzenie obiektów graficznych w kontrolce QGraphicsView

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3445 razy

Kontrolka QGraphicsView umożliwia wyświetlanie elementów graficznych podłączonego do niej obiektu klasy QGraphicsScene. To właśnie obiekt tejże klasy odpowiedzialny jest za dodawanie i usuwanie elementów rysowanych. Część informacji dotyczących sterowania sposobem wyświetlania elementów dodawanych do obiektu klasy QGraphicsScene będzie wykorzystywała informacje omówione przeze mnie na stronie Programowanie → Qt Creator GUI → Qt - podstawy rysowania z wykorzystaniem klasy QPainter. Warto wiedzieć, że seria specjalnych metod klasy QGraphicsScene tworzących obiekty graficzne zwraca równocześnie odpowiedni obiekt tychże klas. Oto te metody klasy QGraphicsScene:

Wszystkie obiekty zwracane przez wyżej wymienione metody umożliwiają sterowanie wyglądem tychże elementów. Mało tego, każdy obiekt graficzny dysponuje metodą setTransform, która umożliwia obracanie, pochylanie, skalowanie i generalnie rzecz ujmując wykonywanie wszystkich dostępnych operacji przekształcenia liniowego na danym obiekcie. Oto prosty przykład programu wykorzystującego podstawy możliwości, jakie daje wykorzystanie kontrolki QGraphicsView.

Plik mainwindow.h:

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QGraphicsScene> #include <QGraphicsEllipseItem> #include <QTransform> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QGraphicsScene *graphicsScene; void paintEvent(QPaintEvent *event) override; private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H

Plik mainwindow.cpp:

#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); graphicsScene = new QGraphicsScene(ui->graphicsView); // tworzenie obiektu sceny graficznej ui->graphicsView->setScene(graphicsScene); // przypisanie sceny do kontrolki QGraphicsView QGraphicsEllipseItem *ellipse = graphicsScene->addEllipse(100, 100, 100, 100); // tworzenie obiektu elipsy ellipse->setFlag(QGraphicsItem::ItemIsMovable); // ustawienie obiektowi elipsy możliwości przemieszczania QGraphicsRectItem *rect1 = graphicsScene->addRect(200, 200, 100, 50); // tworzenie prostokąta QGraphicsRectItem *rect2 = graphicsScene->addRect(200, 200, 100, 50); // tworzenie prostokąta QBrush br(QColor(255,0,0)); // obiekt wypełnienia rect1->setBrush(br); // ustawienie wypełnienia QPen pen(QColor(0,0,255)); // tworzenie pędzla pen.setWidth(5); // ustawienie jego szerokości pen.setStyle(Qt::DashLine); // ustawienie stylu na przerywany rect2->setPen(pen); // przypisanie pędzla do obiektu prostokąta QTransform rotate; // obiekt transformacji dla obrotu rotate.rotate(30); // obracanie o 30 stopni // ustawianie transformacji: iloczyn macierzy przesunięcia i macierzy obrotu i macierzy powrotnego przesunięcia rect->setTransform(QTransform::fromTranslate(-250, -225) * rotate * QTransform::fromTranslate(250, 225)); } MainWindow::~MainWindow() { delete ui; } void MainWindow::paintEvent(QPaintEvent *event){ QWidget::paintEvent(event); QRect size = ui->centralWidget->geometry(); ui->graphicsView->setGeometry(0,0,size.width(), size.height()); }

Wynik działania powyższego kodu został pokazany na poniższym rysunku.

Przykład użycia kontrolki QGraphicsView
Rys. 1
Przykład użycia kontrolki QGraphicsView
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-4.8/qgraphicsview.html - opis klasy QGraphicsView dostępny na stronie Qt
  2. doc.qt.io/qt-5/qgraphicsscene.html - opis klasy QGraphicsScene dostępny na stronie Qt
Propozycje książek