我不知道如何连接计时器,超时和鼠标事件类。当鼠标按下每200毫秒时,我需要在"waterfield“(qwidget)中画一个新的粒子。当我释放按钮时,油漆工不应该画更多的东西。我在构造函数中得到了这样的信息:
timertap.setInterval(200);
timertap.start();
connect(&timertap,SIGNAL(timeout()),this,SLOT(taptap()));
setMouseTracking(true);在我的课堂上,有时隙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 is,因此每200 is信号超时设置和插槽taptap恢复它,并检查可访问是由鼠标按压设置还是由mousereleaseevent重置。有什么建议吗?
发布于 2017-05-19 12:50:24
在waterfield::taptap()中声明指针
QMouseEvent *e;如果不对其进行初始化,程序就会崩溃,因为使用统一指针是未定义的行为。
除此之外,您使用QMouseEvent的方式是错误的。您似乎认为该对象表示通过QMouseEvent类型的任何对象都可用的全局鼠标状态。这不是真的。一个实际表示当前鼠标状态的QMouseEvent对象被以QMouseEvent *e作为参数的插槽捕获,例如QMouseEvent*e。
您需要从mousePressEvent's mousePressEvent(QMouseEvent *e)调用taptap()方法,并将QMouseEvent *e参数传递给taptap()函数。
发布于 2017-05-19 12:41:23
在我点击程序崩溃后。
您需要学习调试代码,而不是要求其他人为您调试代码。
您不应该在连接到计时器的插槽中绘图;您应该在paintEvent函数中这样做。在计时器槽中,您只需添加粒子并调用update()。然后在mousePressEvent中启动计时器,在mouseReleaseEvent中停止它。您也不需要setMouseTracking,因为这是自动完成的,而您一直按下鼠标按钮。
https://stackoverflow.com/questions/44070181
复制相似问题