QMouseEvents в графической сцене не работает

Я довольно новичок в Qt и создаю простое приложение, которое инициализирует ряд пользовательские QGraphicsItems в пользовательский QGraphicsScene. Каждый элемент инициализируется случайным начальным положением и значением веса, которое зависит от положения элемента. При событии перемещения мыши я хочу, чтобы значение веса элементов обновлялось в зависимости от положения курсора мыши.

Я думаю, что мой mouseMoveEvent не признается в graphicsScene, Кажется, он работает нормально в главном окне, где я реализовал метку в строке состояния, чтобы показать количество mouseMoveEvents и X-Y положение mouseMoveEvent

Вот код:

Пользовательская графика Сцена .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();
}

MainWindow .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?

На следующем шаге программы я бы хотел, чтобы элементы обновляли свое значение веса на основе суммы всех их весов, а также двигались на основе алгоритма, который использует новое значение веса для определения новой позиции.

2

Решение

Вам не хватает какого-то контейнера, в котором вы можете сохранить все свои Частицы. В текущей реализации ParticleScene имеет указатель частицы как частную переменную. Вы создаете несколько Частицы в цикле (которые являются QGraphicsItem’s), но только последний указатель хранится в вашей пользовательской сцене. Как вы сказали, вы можете использовать, например, QList для сохранения ваших частиц.

Также я предполагаю, что вы хотели бы перемещать предметы по сцене. Для этого вы также можете сделать собственную реализацию для MousePress событие (чтобы поймать, когда элемент был нажат и по какой координате), MouseMove(для фактического перемещения предмета .. вы уже сделали это, и mouseRelease (например, для вычисления весов или отправки сигнала, который запустит вычисление весов для всех элементов)

Вместо того, чтобы хранить все элементы внутри пользовательской сцены, лучше создать новый класс, например, ItemsManager, в котором будут храниться все элементы, и указатель на сцену. В этом классе вы можете выполнять все операции, связанные с вычислением весов для предметов или других необходимых операций.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]