【问题标题】:How to repetitive function while holding QPushButton?按住 QPushButton 时如何重复功能?
【发布时间】:2014-07-28 01:20:08
【问题描述】:

我有以下代码:

void MainWindow::OnClicked()
{
     otesanek->setPos(otesanek->pos().x() + 5,otesanek->pos().y());
}

connect(right, SIGNAL(clicked()), this, SLOT(OnClicked()));

otesanek 是 QGraphicsScene 中的 QGraphicsItem,right 是同一场景中的 QPushButton

我的目标: 通过按住按钮(右),项目会反复向右移动 5 像素,直到不按住按钮为止。

这段代码在做: 我必须一次又一次地点击才能移动超过 5 像素,然后再移动 5 像素

我试图用 OnPressed 函数来做这个,但没有结果。

希望你能理解我的问题 感谢您的回答:-)

【问题讨论】:

  • 您是否尝试使用QAbstractButton::pressed() 信号而不是clicked() 连接您的对象?

标签: qt qpushbutton


【解决方案1】:

您可以使用QTimer 重复调用班级中的插槽,并使用MousePressMouseRelease 事件来启动和停止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());
}

ma​​in.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 枚举进行比较。

这有帮助吗?

【讨论】:

  • 谢谢!有很大帮助! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2019-07-22
  • 2021-11-08
相关资源
最近更新 更多