您可以使用QTimer 重复调用班级中的插槽,并使用MousePress 和MouseRelease 事件来启动和停止QTimer
非常基本的例子:
MyGraphicsView.h
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QMouseEvent>
#include <QInputDialog>
#include <QGraphicsEllipseItem>
#include <QTimer>
class MyGraphicsView: public QGraphicsView
{
Q_OBJECT
public:
MyGraphicsView() {}
MyGraphicsView( QGraphicsScene *scene, QWidget *parent = 0);
~MyGraphicsView() {};
public slots:
void mousePressEvent( QMouseEvent * event );
void mouseReleaseEvent( QMouseEvent * event );
void moveItem();
private:
QGraphicsEllipseItem *item;
QTimer *timer;
};
MyGraphicsView.cpp
#include "MyGraphicsView.h"
MyGraphicsView::MyGraphicsView( QGraphicsScene *scene, QWidget *parent) : QGraphicsView(scene,parent)
{
item = new QGraphicsEllipseItem( 0, this->scene() );
item->setRect( -50.0, -50.0, 100.0, 100.0 );
item->setFlag( QGraphicsItem::ItemIsMovable );
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT( moveItem() ) );
}
void MyGraphicsView::mousePressEvent( QMouseEvent * )
{
timer->start(10);
}
void MyGraphicsView::mouseReleaseEvent( QMouseEvent * )
{
timer->stop();
}
void MyGraphicsView::moveItem()
{
item->setPos(item->pos().x() + 5,item->pos().y());
}
main.cpp
#include "MyGraphicsView.h"
#include <QApplication>
int main( int argc, char **argv )
{
QApplication app(argc, argv);
QGraphicsScene scene;
scene.setSceneRect( -100.0, -100.0, 200.0, 200.0 );
MyGraphicsView view( &scene );
view.show();
return app.exec();
}
这里两次重复之间的延迟为 10 毫秒,您可以根据自己的喜好进行调整。我没有明确检查按下了哪个鼠标按钮,但您可以通过调用 QMouseEvent::button () 并将其与 Qt::MouseButton 枚举进行比较。
这有帮助吗?