QML在Mips上运行崩溃问题

项目中需要使用QT4.8.3中的QtQuick,编写的QML文件一旦运行就会崩溃。主要现象:

1、使用Behavior on X{

  Animation{

}

}

发现只要对某个属性使用Behavior并且定义其变化的动画时,程序崩溃

2、使用属性Attach

xposition1:  xposition/3

只要在属性Attach时使用除法,程序也崩溃。


最后发现崩溃点在JSValue.h文件中的,被WTF_USE_JSVALUE32_64宏进行保护的代码中,ChangeLog中明确说明Mips是支持这个宏的,对于X86或者PPC则不支持,原因是Padding和Alignment。

直接将其换成WTF_USE_JSVALUE32即可解决问题。

这个宏的意义在于:https://bugs.webkit.org/show_bug.cgi?id=29268

Csaba Osztrogonác  2010-09-09 10:07:53 PDT
(In reply to comment #12)
> > I tried JSVALUE32_64 with QtWebKit/Windows/MinGW again, and it works now. :)
> > I don't know which changeset fixed it in the last 5 months. :)
> > 
> > It works now, so I propose to switch to JSVALUE32_64.
> > SunSpider will be 1.60x faster, but V8 will be 1.19x slower.
> 
> do not they care about this perf regression, or i'm missing something?

The difference between JSVALUE32 and JSVALUE32_64 is the size of JSValue,
which can be 32 bit or 64 bit. The JSVALUE32_64 is faster when you work
with a lot of 64 bit sized numbers (long int, double) such as 3D tests in
SunSpider. Unfortunately it has a little performance regression if your
application can't exploit the 64 bit sized JSValues.

But we have to know the only choice is JSVALUE32_64, because WebKit 
community don't intend to support JSVALUE32 in the future as Gavin said.

不过不清楚为什么在我的嵌入式平台不支持。

你可以在Qml中使用QQuickWidget将QWidget嵌入到Qml中,以便在Qml中显示QWidget。以下是一个简单的示例: 1. 首先,你需要在Qml文件中导入QtQuick.Controls和QtQuick.Window组件: ```qml import QtQuick.Controls 2.12 import QtQuick.Window 2.12 ``` 2. 然后,你可以使用QQuickWidget将QWidget嵌入到Qml中,例如: ```qml Window { visible: true width: 640 height: 480 QQuickWidget { id: widget anchors.fill: parent source: "widget.qml" } } ``` 在这个例子中,我们创建了一个窗口,并在窗口中嵌入了一个名为widget.qmlQml文件。 3. 接下来,你需要在widget.qml文件中使用QtObject来创建一个QObject对象,并将其传递给QWidget,例如: ```qml import QtQuick 2.12 QtObject { id: container property QObject widget: null Component.onCompleted: { if (typeof(widget) === "undefined" || widget === null) { widget = new QObject(container); widget.objectName = "MyWidget"; widget.setProperty("visible", true); widget.setProperty("width", 200); widget.setProperty("height", 200); widget.setProperty("color", "red"); } } } ``` 在这个例子中,我们创建了一个名为container的QtObject,并在其中创建了一个QObject对象widget。我们还设置了widget的一些属性,例如visible、width、height和color。 4. 最后,你需要在QWidget中使用QWindow::fromWinId函数将QWidget嵌入到Qml中,例如: ```cpp QWidget *widget = new QWidget(); QWidget *container = QWidget::createWindowContainer(widget, this); container->setMinimumSize(200, 200); container->setMaximumSize(200, 200); container->setAttribute(Qt::WA_NoSystemBackground); container->setAttribute(Qt::WA_TranslucentBackground); container->setFocusPolicy(Qt::TabFocus); container->setFocus(); QWindow *window = QWindow::fromWinId(container->winId()); if (window) { QQuickItem *item = qobject_cast<QQuickItem*>(engine()->rootObjects().at(0)); if (item) { window->setFlags(window->flags() | Qt::FramelessWindowHint); widget->setParent(window); widget->show(); item->setProperty("widget", QVariant::fromValue(widget)); } } ``` 在这个例子中,我们创建了一个QWidget对象widget,并将其嵌入到一个QWidget对象container中。然后,我们使用QWindow::fromWinId函数将container嵌入到Qml中,并将widget设置为Qml属性widget的值。 以上就是将QWidget在Qml运行的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值