我不知道如何连接计时器超时和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/

10-12 22:35