2015-12-06 35 views
2

我是相當新的Qt和創建一個簡單的應用程序初始化一些在定製QGraphicsScene定製QGraphicsItems。每個項目都用一個隨機起始位置和一個取決於項目位置的權重值進行初始化。在鼠標移動事件,我想要的物品的重量值更新基於鼠標光標QMouseEvents在圖形場景不工作

我覺得我的mouseMoveEvent是不graphicsScene內公認的地位,它似乎很好地工作在其中i在狀態欄實現的標籤的主窗口中顯示的mouseMoveEvents數量和mouseMoveEvent

這裏的XY位置是代碼:

定製圖形場景.H:

class ParticleScene : public QGraphicsScene 
{ 
public: 
    ParticleScene(); 

protected: 
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event); 

private: 
    qreal WTotal; 
    Particle *particle; 

} 

自定義圖形場景的.cpp:

ParticleScene::ParticleScene() 
{ 

//this->setBackgroundBrush(Qt::gray); 
this->setSceneRect(0,0,500,500); 

WTotal=0; 
int ParticleCount =5; 
for (int i =0; i<ParticleCount; i++) 
    { 
    particle= new Particle(); 
    particle->StartX= rand()%500; 
    particle->StartY= rand()%500; 
    particle->W= qSqrt(qPow(particle->StartX,2) + qPow(particle->StartY,2)); 
    particle->setPos(particle->StartX,particle->StartY); 
    this->addItem(particle); 
    particle->setFocus(); 
    WTotal+=particle->W; 
    } 

} 

void ParticleScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
{ 
    update(); 
    QGraphicsScene::mouseMoveEvent(event); 
} 

Particle.h:

我加入了按鍵事件功能,這隻移動了添加到場景中的最後一個項目,我假設只有一個項目可以獲得焦點。 在另一方面,mouseMove事件什麼也沒做

class Particle :public QGraphicsItem 
{ 
public: 
    Particle(); 

    QRectF boundingRect() const; 
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); 
    int StartX; 
    int StartY; 
    qreal W; 

protected: 
    //added keyPressEvent to test 
    virtual void keyPressEvent(QKeyEvent *event); 
    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); 

}; 

Particle.cpp:

Particle::Particle() 
{ 
// setFlag(ItemIsMovable); 
    setFlag(ItemIsFocusable); 
} 

QRectF Particle::boundingRect() const 
{ 
    return QRect(0,0,120,30); 
} 

void Particle::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    QRectF rec= boundingRect(); 
    QBrush Brush(Qt::white); 

    painter->fillRect(rec,Brush); 
    painter->drawText(15,15,"Weight: "+QString::number(W)); 
    painter->drawRect(rec); 

} 

void Particle::keyPressEvent(QKeyEvent *event) 
{ 

    switch(event->key()){ 
    case Qt::Key_Right:{ 
     moveBy(30,0); 
     break;} 
    case Qt::Key_Left:{ 
     moveBy(-30,0); 
     break;} 
    case Qt::Key_Up:{ 
     moveBy(0,-30); 
     break;} 
    case Qt::Key_Down:{ 
     moveBy(0,30); 
     break;} 
    } 
    update(); 
} 

void Particle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
{ 
    this->W= this->W/qSqrt(qPow(event->pos().x(),2) + qPow(event->pos().y(),2)); 
    moveBy(30,0); 
    update(); 
} 

主窗口的.h和CPP:狀態欄標籤在這裏顯示小鼠座標正確,即mouseMoveEvent函數

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

    void mouseMoveEvent(QMouseEvent *event); 
protected: 

private: 
    Ui::MainWindow *ui; 
    ParticleScene *scene; 
    QLabel *statlabel; 

    int moves; 
}; 

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    statlabel=new QLabel(this); 
    ui->statusBar->addWidget(statlabel); 
    statlabel->setText ("Mouse Coordinates"); 

    setCentralWidget(ui->graphicsView); 
    centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents); 
    ui->graphicsView->setMouseTracking(true); 

    scene= new ParticleScene(); 
    ui->graphicsView->setScene(scene); 
    ui->graphicsView->setRenderHint(QPainter::Antialiasing); 

    moves=0; 

} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::mouseMoveEvent(QMouseEvent *event) 
{ 
    moves+=1; 
    statlabel->setText("MouseMoves " +QString::number(moves)+ " X:"+QString::number(event->pos().x())+"-- Y:"+QString::number(event->pos().y())); 
} 

我在程序中丟失了什麼導致mousemoveevent無法運行,並且有沒有辦法將所有項目集中在一起?我需要也許,使他們成爲QList

在程序的下一步中,我希望項目根據所有權重的總和更新其權重值,並根據使用新權重值的算法移動以確定新位置。

+0

刪除函數* ParticleScene :: mouseMoveEvent *。您不需要在這裏調用更新,除非該函數中有其他代碼,否則它不會爲您做任何事情。當你移動場景中的物品時,只要其邊界矩正確,它就會爲你更新。您可以一次選擇多個項目,但[QGraphicsItemGroup](http://doc.qt.io/qt-5/qgraphicsitemgroup.html)可能就是您要查找的內容。 – TheDarkKnight

回答

0

您錯過了某種容器,您可以在其中保存所有顆粒。在當前的實施中,ParticleScene具有粒子指針作爲私有變量。您正在循環中創建多個粒子(它們是QGraphicsItem的),但只有最後一個指針存儲在自定義場景中。正如你所說的,你可以使用QList來保存你的粒子。

另外我假設你想在你現場移動你的物品。對於您還可以讓你擁有實施MousePress事件移動around..you已經做了這個項目(當按下項目,趕在什麼座標),的MouseMove(實際和mouseRelease(例如用於計算權重或發送觸發所有項目的權重計算的信號)

而不是保持自定義場景中的所有項目更好地創建一個新的類,例如ItemsManager中的所有項目將被存儲並且指向場景在這個類中你可以執行所有關於物品重量計算或者其他需要的操作的操作