https://blog.csdn.net/elf001/article/details/8978528windows
一、知識點:函數
/* Item則是具體要顯示的東西。最基本的Qt類就是QGraphicsItem,通常若是要顯示自定義的形狀一般的
* 作法是繼承自QGraphicsItem,而後去實現它的兩個純虛函數boundingRect和paint
* virtual QRectF boundingRect () const = 0
* virtual void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ) = 0
* boundingRect就是返回該Item的包圍盒,用於Graphics內部的碰撞檢測以及選取等計算。paint則是用於Item的重繪。
*/this
二、實現一個item類:spa
2.一、Sation.h.net
#ifndef SATION_H #define SATION_H #include <QGraphicsItem> /*新實現一個sation類,這個類能夠在scene中用,也能夠在mainwindow中用*/ class Sation : public QGraphicsItem { public: Sation(qreal, qreal); void paint(QPainter*, // // paint虛函數:繪製圖標 const QStyleOptionGraphicsItem*, QWidget* ); QRectF boundingRect() const{ // boundingRect虛函數:定義每一個圖標對應的外部邊框 return QRectF(-6.5, -13, 13, 18);//返回一個矩形:比咱們要畫的圖標稍大 } }; #endif // SATION_H
2.二、sation.cpp3d
#include "sation.h" #include <QPainter> Sation::Sation(qreal x, qreal y):QGraphicsItem() { setPos(x, y); } //構造函數裏咱們根據x和y傳遞的參數設置座標。在paint函數繪製咱們的電臺圖標。 void Sation::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { //繪製電臺圖標,必須小於邊框矩形 painter->setRenderHint( QPainter::Antialiasing ); painter->setPen( QPen( Qt::black, 2 ) ); painter->drawRect( -4, -3, 8, 7 ); painter->drawLine( 0, -4, 0, -11 ); painter->drawLine( -5, -11, 0, -6 ); painter->drawLine( +5, -11, 0, -6 ); }
三、在場景類中:code
3.一、scene.hblog
#ifndef SCENE_H #define SCENE_H class QGraphicsSceneMouseEvent; #include <QGraphicsScene> #include "sation.h" class Scene : public QGraphicsScene { Q_OBJECT public: Scene( ); // constructor signals: void message( QString ); // 文本消息信號 protected: void mousePressEvent( QGraphicsSceneMouseEvent* ); // 接收鼠標按下事件 }; #endif // SCENE_H
3.二、scene.cpp繼承
#include "scene.h" #include <QGraphicsSceneMouseEvent> Scene::Scene( ) : QGraphicsScene() { addLine( 0, 0, 0, 1, QPen(Qt::transparent, 1) ); /*在構造函數裏咱們須要在(0,0)處添加一個不可見的項做爲場景的初始錨。 * 如裏沒有這樣作,Qt默認會把用戶添加第一個電臺做爲左上角定位的錨, * 後面添加的電臺位置並非用戶所想的。*/ } void Scene::mousePressEvent( QGraphicsSceneMouseEvent* event ) { // 判斷用戶是否按下鼠標左鍵 if ( event->button() != Qt::LeftButton ) return; // 發送信息信號 qreal x = event->scenePos().x(); qreal y = event->scenePos().y(); addItem(new Sation(x, y)); // 在用戶點擊場景的位置新建一個電臺 emit message( QString("Clicked at %1,%2").arg(x).arg(y) ); }
這裏是在scene中的鼠標點擊位置的x,y用來構造一個sation,也就是將此時左鍵鼠標點擊的x,y做爲一個傳參初始化一個item,做爲sation的的做圖座標原點,畫矩形和線事件
三、mainwindow中:設置view管理scene
3.一、mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "scene.h" class Scene; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: Scene* m_scene; public slots: //添加槽方法的定義 void showMessage( QString ); // 在狀態欄上顯示消息 }; #endif // MAINWINDOW_H
3.二、mainwindows.cpp中
#include "mainwindow.h" #include <QMenuBar> #include <QStatusBar> #include <QGraphicsView> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { menuBar()->addMenu( "&File" ); menuBar()->addMenu( "&Edit" ); menuBar()->addMenu( "&View" ); menuBar()->addMenu( "&Simulate" ); menuBar()->addMenu( "&Help" ); statusBar()->showMessage("QSimulate has started"); // 建立場景和顯示場景的中央視圖部件 m_scene = new Scene(); //View是視圖,負責顯示;Scene是文檔,負責存儲數據。因此從這個角度出發,咱們能夠這樣認爲,一個Scene能夠關聯到多個View,就比如一份數據能夠有多個視圖去查看它同樣。 QGraphicsView* view = new QGraphicsView( m_scene ); //QGraphicsScene是一個視圖,它不可以單獨存在,必須關聯到至少一個QGraphicsView view->setAlignment( Qt::AlignLeft | Qt::AlignTop ); view->setFrameStyle( 0 ); setCentralWidget( view ); //將信號與槽關聯:m_scene發射message信號時,MainWindow接收信號,執行showMessage槽函數 connect( m_scene, SIGNAL(message(QString)), this, SLOT(showMessage(QString)) ); } MainWindow::~MainWindow() { } void MainWindow::showMessage( QString msg ) { statusBar()->showMessage( msg ); // 在主窗口狀態欄上顯示消息 }