Qt - tworzenie obiektów graficznych w kontrolce QGraphicsView

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

Listing 1
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QGraphicsScene>
  5. #include <QGraphicsEllipseItem>
  6. #include <QTransform>
  7. namespace Ui {
  8. class MainWindow;
  9. }
  10. class MainWindow : public QMainWindow
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit MainWindow(QWidget *parent = 0);
  15. ~MainWindow();
  16. QGraphicsScene *graphicsScene;
  17. void paintEvent(QPaintEvent *event) override;
  18. private:
  19. Ui::MainWindow *ui;
  20. };
  21. #endif // MAINWINDOW_H

Plik mainwindow.cpp:

Listing 2
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4. QMainWindow(parent),
  5. ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. graphicsScene = new QGraphicsScene(ui->graphicsView); // tworzenie obiektu sceny graficznej
  9. ui->graphicsView->setScene(graphicsScene); // przypisanie sceny do kontrolki QGraphicsView
  10. QGraphicsEllipseItem *ellipse = graphicsScene->addEllipse(100, 100, 100, 100); // tworzenie obiektu elipsy
  11. ellipse->setFlag(QGraphicsItem::ItemIsMovable); // ustawienie obiektowi elipsy możliwości przemieszczania
  12. QGraphicsRectItem *rect1 = graphicsScene->addRect(200, 200, 100, 50); // tworzenie prostokąta
  13. QGraphicsRectItem *rect2 = graphicsScene->addRect(200, 200, 100, 50); // tworzenie prostokąta
  14. QBrush br(QColor(255,0,0)); // obiekt wypełnienia
  15. rect1->setBrush(br); // ustawienie wypełnienia
  16. QPen pen(QColor(0,0,255)); // tworzenie pędzla
  17. pen.setWidth(5); // ustawienie jego szerokości
  18. pen.setStyle(Qt::DashLine); // ustawienie stylu na przerywany
  19. rect2->setPen(pen); // przypisanie pędzla do obiektu prostokąta
  20. QTransform rotate; // obiekt transformacji dla obrotu
  21. rotate.rotate(30); // obracanie o 30 stopni
  22. // ustawianie transformacji: iloczyn macierzy przesunięcia i macierzy obrotu i macierzy powrotnego przesunięcia
  23. rect->setTransform(QTransform::fromTranslate(-250, -225) * rotate * QTransform::fromTranslate(250, 225));
  24. }
  25. MainWindow::~MainWindow()
  26. {
  27. delete ui;
  28. }
  29. void MainWindow::paintEvent(QPaintEvent *event){
  30. QWidget::paintEvent(event);
  31. QRect size = ui->centralWidget->geometry();
  32. ui->graphicsView->setGeometry(0,0,size.width(), size.height());
  33. }

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

Komentarze