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

时间:2017-05-19 12:30:13

标签: c++ qt timer qmouseevent

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

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;
}

点击程序崩溃后。我认为这样做是个好主意。定时器设置为200ms,因此每隔200ms信号超时设置,并且插槽taptap重新接收它并检查tapenable是通过mousepressevent设置还是由mousereleaseevent重置。 有什么建议吗?

2 个答案:

答案 0 :(得分:1)

  

点击程序崩溃后。

您需要学习调试代码,而不是让别人为您执行此操作。

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

答案 1 :(得分:1)

您在 waterfield :: taptap()

中声明了一个指针
iptables -nvL -t nat

没有初始化它,所以程序崩溃因为使用单位指针是未定义的行为。

除此之外,你以错误的方式使用 QMouseEvent 。您似乎认为此对象表示可通过QMouseEvent类型的任何对象获得的某些全局鼠标状态。这不是真的。实际表示当前鼠标状态的QMouseEvent对象被以 QMouseEvent * e 作为参数的插槽捕获,例如 mousePressEvent()

您需要从 mousePressEvent(QMouseEvent * e)调用 taptap()方法,并传递 mousePressEvent &#39; s < taptap()函数的strong> QMouseEvent * e 参数。您还应该在 mousePressEvent()插槽中启动计时器,并将其停在 mouseReleaseEvent()中。