【问题标题】:qt holding mouse button and timer cppqt按住鼠标按钮和定时器cpp
【发布时间】:2017-05-19 20:50:24
【问题描述】:

我不知道如何连接定时器超时和鼠标事件类。当每 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 重置。 有什么建议吗?

【问题讨论】:

    标签: c++ qt timer qmouseevent


    【解决方案1】:

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

    QMouseEvent *e;
    

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

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

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

    【讨论】:

    • 但是如何将没有参数的 timerout 信号与现在有 qmouseevent * 作为参数的 taptap 插槽连接起来?
    • 我想最简单的解决方案是使用 QCursor::pos() 而不是 QMouseEvent 如果你需要的只是坐标。 QCursor::pos() 是一个静态函数,所以你可以从你喜欢的任何地方调用它,而不必担心传递对象。
    【解决方案2】:

    点击后程序崩溃。

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

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

    【讨论】:

    • 我猜你错过了我回答的第一行。
    • 删除这些行不会改变任何东西。我在“Q_DECL_CONSTEXPR inline QPoint QPointF::toPoint() const { return QPoint(qRound(xp), qRound(yp)); } 中有分段错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多