c++ - qt按住鼠标按钮和定时器cpp

标签 c++ qt timer qmouseevent

我不知道如何连接定时器超时和鼠标事件类。每 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 毫秒,因此每 200 毫秒设置一次信号超时,插槽 taptap 接收它并检查 tapenable 是否由 mousepressevent 设置或由 mousereleaseevent 重置。 有什么建议吗?

最佳答案

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

QMouseEvent *e;

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

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

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

关于c++ - qt按住鼠标按钮和定时器cpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44070181/

相关文章:

qt - 在 Qt 中向同一个对象(例如 this)发送信号是一种反模式

c++ - 关于使用 QThreadStorage 的线程安全

javascript - 了解 setInterval 中剩余的时间并将其应用于计时器的暂停和恢复

java - 如何在 Java GUI 中重置计时器并在停止后显示消息

c++ - 在 C++ 中让一个类完成工作还是将一个类分成几个子类?

c++ - 计算二进制数据

c++ - 显式调用 WINAPI ReadFile()

c++ - 当前正在运行哪个单元测试?

python - 在 PyQT 中如何存储 QRunnable 中信号发出的数据

timer - CUDA:cudaEvent_t和cudaThreadSynchronize用法