Qt之QGraphicsScene顯示電臺:添加Item

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 );  // 在主窗口狀態欄上顯示消息
}
相關文章
相關標籤/搜索