我有以下代码:
void MainWindow::OnClicked()
{
otesanek->setPos(otesanek->pos().x() + 5,otesanek->pos().y());
}
connect(right, SIGNAL(clicked()), this, SLOT(OnClicked()));
otesanek 是QGraphicsScene中的QGraphicsItem,右是同一场景中的QPushButton
我的目标: 按住按钮(右),项目重复移动超过5像素,直到不按住按钮。
这段代码在做: 我必须一次又一次地点击以移动5个像素并再次移动5像素
我尝试使用OnPressed函数进行此操作,但我没有得到任何结果。
希望你理解我的问题 谢谢你的回答: - )
答案 0 :(得分:0)
您可以使用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 ms,您可以根据自己的喜好进行调整。我没有明确检查按下了哪个鼠标按钮,但您可以通过调用QMouseEvent::button ()
并将其与Qt::MouseButton
枚举进行比较来实现。
这有帮助吗?