Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3673 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:

  • addEllipse - tworzy obiekt eliptyczny i zwraca wskaźnik na obiekt klasy QGraphicsEllipseItem;
  • addItem - dodaje istniejący obiekt klasy QGraphicsItem, który jest klasą bazową wszystkich klas opisujących obiekty, które można dodawać do obiektu klasy QGraphicsScene;
  • addLine - tworzy obiekt linii i zwraca wskaźnik na obiekt klasy QGraphicsLineItem;
  • addPath - tworzy obiekt ścieżki (linii, na którą mogą składać się krzywe Beziara jak i linie proste) i zwraca wskaźnik na obiekt klasy QGraphicsPathItem;
  • addPixmap - tworzy obiekt zawierający bitmapę zawartą w obiekcie klasy QPixmap i zwraca wskaźnik na obiekt QGraphicsPixmapItem;
  • addPolygon - tworzy obiekt wielokąta i zwraca wskaźnik na obiekt klasy QGraphicsPolygonItem;
  • addRect - tworzy obiekt prostokąta i zwraca wskaźnik na obiekt klasy QGraphicsRectItem;
  • addSimpleText - tworzy obiekt tekstowy i zwraca wskaźnik na obiekt klasy QGraphicsSimpleTextItem.

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
Layout wykonany przez autora strony, wszelkie prawa zastrzeżone. Jakiekolwiek użycie części lub całości grafik znajdujących się na tej stronie bez pisemnej zgody jej autora surowo zabronione.