首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qt握住鼠标按钮和计时器cpp

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

Stack Overflow用户
提问于 2017-05-19 12:30:13
回答 2查看 744关注 0票数 0

我不知道如何连接计时器,超时和鼠标事件类。当鼠标按下每200毫秒时,我需要在"waterfield“(qwidget)中画一个新的粒子。当我释放按钮时,油漆工不应该画更多的东西。我在构造函数中得到了这样的信息:

代码语言:javascript
复制
timertap.setInterval(200);
timertap.start();
connect(&timertap,SIGNAL(timeout()),this,SLOT(taptap()));
setMouseTracking(true);

在我的课堂上,有时隙taptap()和bool tapenable。

这是不起作用的代码:

代码语言:javascript
复制
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 is,因此每200 is信号超时设置和插槽taptap恢复它,并检查可访问是由鼠标按压设置还是由mousereleaseevent重置。有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-19 12:50:24

waterfield::taptap()中声明指针

代码语言:javascript
复制
QMouseEvent *e;

如果不对其进行初始化,程序就会崩溃,因为使用统一指针是未定义的行为。

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

您需要从mousePressEvent's mousePressEvent(QMouseEvent *e)调用taptap()方法,并将QMouseEvent *e参数传递给taptap()函数。

票数 1
EN

Stack Overflow用户

发布于 2017-05-19 12:41:23

在我点击程序崩溃后。

您需要学习调试代码,而不是要求其他人为您调试代码。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44070181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档