qt按住鼠标按钮和定时器cpp
qt holding mouse button and timer cpp
我不知道如何连接定时器超时和鼠标事件 class。当每 200 毫秒按下鼠标按钮时,我需要在 "waterfield" (qwidget) 中绘制一个新粒子。当我释放按钮画家不应该画更多。
我在我的构造函数中得到了这个:
timertap.setInterval(200);
timertap.start();
connect(&timertap,SIGNAL(timeout()),this,SLOT(taptap()));
setMouseTracking(true);
在我的 class 中有插槽 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;
}
点击后程序崩溃。我认为这样做是个好主意。计时器设置为 200 毫秒,因此每 200 毫秒设置一次信号超时,插槽 taptap 接收它并检查 tapenable 是否由 mousepressevent 设置或由 mousereleaseevent 重置。
有什么建议吗?
After i click program crashs.
你需要学会调试你的代码,而不是让别人帮你做。
您不应该在连接到计时器的插槽中绘图;您应该在 paintEvent
函数中执行此操作。在计时器槽中,您只需添加粒子并调用 update()
。然后你在 mousePressEvent
启动计时器并在 mouseReleaseEvent
停止它。您也不需要 setMouseTracking
,因为这是在您按住鼠标按钮时自动完成的。
您在 waterfield::taptap():
中声明了一个指针
QMouseEvent *e;
没有初始化它,所以程序崩溃,因为使用未定义的指针是未定义的行为。
除此之外,您还错误地使用了 QMouseEvent。你似乎认为这个对象代表了一些全局鼠标状态,它可以通过 QMouseEvent 类型的任何对象获得。这不是真的。一个实际表示当前鼠标状态的 QMouseEvent 对象被以 QMouseEvent *e 作为参数的插槽捕获,例如 mousePressEvent().
您需要从 mousePressEvent(QMouseEvent *e) 调用 taptap() 方法,并传递 mousePressEvent 的 QMouseEvent *e 参数到 taptap() 函数。您还应该在 mousePressEvent() 插槽中启动计时器并在 mouseReleaseEvent().
中停止它
我不知道如何连接定时器超时和鼠标事件 class。当每 200 毫秒按下鼠标按钮时,我需要在 "waterfield" (qwidget) 中绘制一个新粒子。当我释放按钮画家不应该画更多。 我在我的构造函数中得到了这个:
timertap.setInterval(200);
timertap.start();
connect(&timertap,SIGNAL(timeout()),this,SLOT(taptap()));
setMouseTracking(true);
在我的 class 中有插槽 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;
}
点击后程序崩溃。我认为这样做是个好主意。计时器设置为 200 毫秒,因此每 200 毫秒设置一次信号超时,插槽 taptap 接收它并检查 tapenable 是否由 mousepressevent 设置或由 mousereleaseevent 重置。 有什么建议吗?
After i click program crashs.
你需要学会调试你的代码,而不是让别人帮你做。
您不应该在连接到计时器的插槽中绘图;您应该在 paintEvent
函数中执行此操作。在计时器槽中,您只需添加粒子并调用 update()
。然后你在 mousePressEvent
启动计时器并在 mouseReleaseEvent
停止它。您也不需要 setMouseTracking
,因为这是在您按住鼠标按钮时自动完成的。
您在 waterfield::taptap():
中声明了一个指针QMouseEvent *e;
没有初始化它,所以程序崩溃,因为使用未定义的指针是未定义的行为。
除此之外,您还错误地使用了 QMouseEvent。你似乎认为这个对象代表了一些全局鼠标状态,它可以通过 QMouseEvent 类型的任何对象获得。这不是真的。一个实际表示当前鼠标状态的 QMouseEvent 对象被以 QMouseEvent *e 作为参数的插槽捕获,例如 mousePressEvent().
您需要从 mousePressEvent(QMouseEvent *e) 调用 taptap() 方法,并传递 mousePressEvent 的 QMouseEvent *e 参数到 taptap() 函数。您还应该在 mousePressEvent() 插槽中启动计时器并在 mouseReleaseEvent().
中停止它