【问题标题】:QList for touch-points not being created, "A data abort exception has occurred"未创建接触点的 QList,“发生数据中止异常”
【发布时间】:2012-03-21 08:33:16
【问题描述】:

我正在尝试为我的针对 N8(和 C7)的程序获取触摸输入,但我无法使用 QTouchEvent::touchPoints() 创建用于保持接触点的 QList。程序崩溃并显示以下行:Thread has crashed: A data abort exception has occurred accessing 0xee

重载的事件函数如下:

bool GLWindow::event(QEvent *event)
{
    switch ( event->type() ) {
        case QEvent::TouchBegin: {
            QList<QTouchEvent::TouchPoint> touchBeginPoints =
                        static_cast<QTouchEvent *>(event)->touchPoints();
            foreach (const QTouchEvent::TouchPoint &touchBeginPoint, touchBeginPoints)
            {
                float touchBeginX = touchBeginPoint.pos().x();
                float touchBeginY = touchBeginPoint.pos().y();
                qDebug() << "touchBeginPoint := " << touchBeginX << ",  " << touchBeginY;
            }
            break;
        }
        case QEvent::TouchUpdate: {
            // same as touch begin: getting touch point
            break;
        }
        case QEvent::TouchEnd: {
            // same as touch begin: getting touch point
            break;
        }
        default: {
            qDebug() << "Goodbye";
           return true;
        }
    }
    return true;
}

现在,

  • 我以前从未使用过容器。但是在程序的另一部分创建和使用 QList 可以正常工作。我应该在我的 .pro 文件中包含一些内容吗? (大多数问题似乎都与我有关!)
  • 我阅读了(一点点)关于 Qt 和 Symbian 中的异常的信息,但我无法了解其中的大部分内容。但除了 3D 对象的纹理之外,我没有做任何基于网络或资源的 i/o 或操作。运行程序时的内存分配是否可能会产生一些问题?

基本上我只是想打印接触点。但我不知道为什么我不能创建一个 QList。代码编译得很好。我尽了最大努力(不成功),但是有没有其他方法可以获取触摸点的屏幕坐标(不需要 QList)?欢迎任何cmets。

[Reposting 来自qt-project.org。]

【问题讨论】:

  • 只是一种预感,但是如果您将 static_cast 替换为 qobject_cast 会发生什么?
  • @teukkam 事件不是对象...也许是 dynamic_cast...
  • @teukkam 导致错误:no matching function for call to 'qobject_cast(QEvent*&amp;)'。我也尝试了 dynamic_cast,它给出了相同的结果。谢谢。
  • 你是对的@UmNyobe 对那个错误感到抱歉。重点是,如果我没记错的话,数据中止是 Symbian 的一种神秘方式,即在某处取消引用了一个空指针(或其他任意指针)。
  • 我越来越确信在这个代码块中没有什么会导致崩溃。您是否尝试在案例块的顶部放置一个 qDebug,以查看它是否在创建 QList 之前已经崩溃?

标签: qt qglwidget qlist


【解决方案1】:

您的语法是 100% 正确的。看看这个例子:http://www.developer.nokia.com/Community/Wiki/Painting_in_Qt

我猜想QTouchEvent::touchPoints() 返回一个足够大的列表,它会溢出你的堆栈。尝试为您的应用增加堆栈大小。

【讨论】:

  • 在创建 QList 之前放置 qDebug() (event)->touchPoints()->size() 看看它将返回多大的列表
  • 我把你首先说的 qDebug 语句放在 touch-begin 崩溃的地方。然后我把它放在开关外面,结果发现事件函数只被调用了两次:第一次大小是0,第二次是54065912。请注意,这是我什至没有触摸屏幕的时候,即在应用程序启动/初始化期间调用的事件函数。然后我在手指画示例中尝试了相同的操作,并且 touchPoints QList 的大小大部分时间都是 1(并且从不超过 2 或 3),这加强了您的大列表论点。
  • 重点是,即使我增加了应用程序的堆栈大小,QList 也太大而无法让其他任何东西占用内存空间。所以我认为我应该以某种方式处理它的大小(而不是应用程序的堆栈大小),但我不能,因为一旦创建列表,事情就会崩溃。
  • 如果你把它放在开关之外,你会得到随机事件的任意结果,甚至不是 QTouchEvents。此外,如果您的触摸驱动程序适配行为很有趣并且报告的触摸点数量荒谬,那么您在其他应用程序中也会遇到问题。所以我想有这个理论......
  • 我尝试获取(“假定”触摸)事件值,它们是 2、3、4 或 5:鼠标事件的所有值。给你+1(如果可以的话+100,因为我永远无法单独找到这个错误)。尽管 Qt 示例的触摸事件运行良好,但我认为我将继续处理鼠标事件,因为我只需要点击屏幕即可。但是点击点只能给我一个点,而用户可能会触摸多个点。但我会先在某个朋友的电脑上测试这个应用程序,然后看看会发生什么。非常感谢您的帮助。
【解决方案2】:

你的语法正确吗?编译错误似乎强化了teukkam点... 替换时会发生什么

  static_cast<QTouchEvent *>(event)->touchPoints()

  (dynamic_cast<QTouchEvent *>(event))->touchPoints()

注意括号...

【讨论】:

  • 不,(dynamic_cast&lt;QTouchEvent *&gt;(event))-&gt;touchPoints() 与不带括号的 static_cast 或 dynamic_cast 的结果相同,我一触摸屏幕就会崩溃。谢谢。
猜你喜欢
  • 2018-06-08
  • 2021-09-29
  • 2018-07-09
  • 2014-05-09
  • 2020-06-07
  • 2019-07-10
  • 2014-01-20
  • 1970-01-01
相关资源
最近更新 更多