0

我不知道如何连接定时器超时和鼠标事件类。当每 200 毫秒按下鼠标按钮时,我需要在“waterfield”(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 设置或通过 mousereleaseevent 重置。有什么建议么?

4

2 回答 2

1

您在waterfield::taptap()中声明一个指针:

QMouseEvent *e;

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

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

您需要从mousePressEvent(QMouseEvent *e)调用taptap()方法,并将mousePressEventQMouseEvent *e参数传递给taptap()函数。您还应该在mousePressEvent()插槽中启动计时器并将其停止在mouseReleaseEvent()中。

于 2017-05-19T12:50:24.323 回答
1

在我点击程序崩溃后。

你需要学会调试你的代码,而不是要求别人为你做。

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

于 2017-05-19T12:41:23.200 回答