我不知道如何连接计时器超时和mouseevent类。每200毫秒按下一次鼠标按钮时,我需要在“水域”(qwidget)中绘制一个新粒子。当我释放按钮画家时,不要画更多。
我在构造函数中得到了这个:
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;
}
我单击后程序崩溃。我认为这样做是个好主意。计时器设置为200毫秒,因此每200毫秒设置一次信号超时,并在插槽中轻按taptap以接收它,并检查是否通过mousepressevent设置了tapenable还是通过mousereleaseevent重置了。
有什么建议么?
最佳答案
您在waterfield :: taptap()中声明一个指针:
QMouseEvent *e;
没有初始化它,所以程序崩溃,因为使用统一指针是未定义的行为。
除此之外,您以错误的方式使用QMouseEvent。您似乎认为该对象表示某种全局鼠标状态,该状态可通过QMouseEvent类型的任何对象使用。这不是真的。实际代表当前鼠标状态的QMouseEvent对象被以QMouseEvent * e为参数的插槽捕获,例如mousePressEvent()。
您需要从mousePressEvent(QMouseEvent * e)调用taptap()方法,并将mousePressEvent的QMouseEvent * e参数传递给taptap()函数。您还应该在mousePressEvent()插槽中启动计时器,并将其停止在mouseReleaseEvent()中。
关于c++ - qt按住鼠标按钮和计时器cpp,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44070181/