C++ qt按住鼠标按钮和计时器cpp

C++ qt按住鼠标按钮和计时器cpp,c++,qt,timer,qmouseevent,C++,Qt,Timer,Qmouseevent,我不知道如何连接定时器超时和mouseevent类。我需要在“waterfield”(qwidget)中绘制一个新粒子,当鼠标按钮每200毫秒按下一次。当我释放按钮时,画师不应该绘制更多。 我在构造器中得到了这个: timertap.setInterval(200); timertap.start(); connect(&timertap,SIGNAL(timeout()),this,SLOT(taptap())); setMouseTracking(true); 在我的课堂上有slo

我不知道如何连接定时器超时和mouseevent类。我需要在“waterfield”(qwidget)中绘制一个新粒子,当鼠标按钮每200毫秒按下一次。当我释放按钮时,画师不应该绘制更多。 我在构造器中得到了这个:

timertap.setInterval(200);
timertap.start();
connect(&timertap,SIGNAL(timeout()),this,SLOT(taptap()));
setMouseTracking(true);
在我的课堂上有slot taptap()和bool tapenable

这是不起作用的代码:

void waterfield::taptap()
{
    QMouseEvent *e;
    if(tapenable && e->button()==Qt::LeftButton)
    {
        particle p;
        int x=e->pos().x();
        int y=e->pos().y();
        p.position.y=y;
        p.position.x=x;
        zbiorczastek.push_back(p);
        painter.drawEllipse(x,y,particlesize,particlesize);
    }
}

void waterfield::mousePressEvent(QMouseEvent *e)
{
    tapenable=true;
}

void waterfield::mouseReleaseEvent(QMouseEvent *e)
{
    tapenable=true;
}
我点击后程序崩溃。我认为这样做是个好主意。定时器设置为200ms,因此每设置200ms信号超时,插槽点击接收它,并检查是否由MousePresseEvent设置TapeEnable或由mousereleaseevent重置。 有什么建议吗

我点击后程序崩溃

你需要学会调试你的代码,而不是让别人帮你调试

您不应该在连接到计时器的插槽中绘图;你应该在函数中这样做。在计时器槽中,只需添加粒子并调用
update()
。然后在
mousePressEvent
中启动计时器,并在
mouseReleaseEvent
中停止计时器。您也不需要设置鼠标追踪,因为这是在按住鼠标按钮的同时自动完成的

我点击后程序崩溃

你需要学会调试你的代码,而不是让别人帮你调试


您不应该在连接到计时器的插槽中绘图;你应该在函数中这样做。在计时器槽中,只需添加粒子并调用
update()
。然后在
mousePressEvent
中启动计时器,并在
mouseReleaseEvent
中停止计时器。您也不需要设置鼠标追踪,因为这是在按住鼠标按钮的同时自动完成的。

您可以在waterfield::taptap()中声明指针:

QMouseEvent *e;
没有初始化它,因此程序崩溃,因为使用统一指针是未定义的行为

除此之外,您使用的QMouseEvent方式是错误的。您似乎认为该对象表示通过QMouseEvent类型的任何对象都可用的全局鼠标状态。事实并非如此。实际表示当前鼠标状态的QMouseEvent对象被以QMouseEvent*e为参数的插槽捕获,例如mouseepressevent()


您需要从mousePressEvent(QMouseEvent*e)调用taptap()方法,并将mousePressEventQMouseEvent*e参数传递给taptap()函数。您还应该在MousePresseEvent()插槽中启动计时器,并在mouseReleaseEvent()中停止计时器。您可以在waterfield::taptap()中声明指针:

QMouseEvent *e;
没有初始化它,因此程序崩溃,因为使用统一指针是未定义的行为

除此之外,您使用的QMouseEvent方式是错误的。您似乎认为该对象表示通过QMouseEvent类型的任何对象都可用的全局鼠标状态。事实并非如此。实际表示当前鼠标状态的QMouseEvent对象被以QMouseEvent*e为参数的插槽捕获,例如mouseepressevent()


您需要从mousePressEvent(QMouseEvent*e)调用taptap()方法,并将mousePressEventQMouseEvent*e参数传递给taptap()函数。您还应该启动MousePresseEvent()插槽中的计时器,并将其停止在mouseReleaseEvent()中。我猜您错过了我答案的第一行。删除这些行不会改变任何事情。“Q_DECL_CONSTEXPR inline QPoint QPointF::toPoint()const{return QPoint(qRound(xp),qRound(yp));}”中出现了分段错误。我想您错过了我答案的第一行。删除这些行不会改变任何事情。我在“Q_DECL_CONSTEXPR inline QPoint QPointF::toPoint()const{return QPoint(qRound(xp),qRound(yp));}”中遇到了分段错误,但是如何将没有参数的timerout信号与taptap插槽连接起来,taptap插槽现在有qmouseevent*作为参数?我想最简单的解决方案是使用QCursor::pos()而不是QMouseEvent,如果您只需要后者的坐标。QCursor::pos()是一个静态函数,因此您可以在任何地方调用它,而不必担心传递对象。但是如何将没有参数的timerout信号与现在有qmouseevent*作为参数的taptap插槽连接起来?我想最简单的解决方案是使用QCursor::pos()而不是QMouseEvent,如果您只需要后者的坐标。QCursor::pos()是一个静态函数,因此您可以从任何地方调用它,而不必担心传递对象。