使用QQuickView rootContext设置可以从QML

时间:2017-06-01 17:05:36

标签: c++ multithreading qt

我是Qt的新人,虽然我用C ++写了很多年只用了大约一年左右的时间。我们正在编写一个相机应用程序,它有一些用于访问帧缓冲区,视频等的C ++代码和一个用QML编写的GUI。有必要在c ++类中调用gstreamer,它需要在一个单独的线程中运行,并且需要从QML代码中调用(因为如果在启动QML之前调用它,QML代码会挂起等待线程完成)。 p>

我发现在回答其他人的问题时,这是一个很好的方式:How Start a Qthread from qml?。不幸的是,当我试图修改我的代码以运行时,如其中一个答案所示,我得到一个SIGABT信号。当代码执行以下行时会发生这种情况:

view.engine()->rootContext()->setContextProperty("thread", &gstworker);

main.cpp函数如下所示:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQmlContext>

#include <gst/gst.h>
#include "common.h"
#include "fbctl.h"
#include "gstcameraif.h"
#include "gstworker.h"

int main(int argc, char *argv[])
{
    DBG_PRINT("main.cpp: register FbCtl type\n");
    qmlRegisterType<FbCtl>("test.fbctl.qt", 1, 0, "FbCtl");

    DBG_PRINT("main.cpp: register GstCameraIf type\n");
    qmlRegisterType<GstCameraIf>("test.gstcameraif.qt", 1, 0, "GstCameraIf");

    DBG_PRINT("main.cpp: register GstWorker type");
    qmlRegisterType<GstWorker>("test.gstworker.qt", 1, 0, "GstWorker");


    gst_init(&argc, &argv);

    GstCameraIf gStreamer;

    FbCtl   fbSetup;            // get a local instance of the frame buffer control object
    fbSetup.setupOverlay();     // initialize the overlay setup
    fbSetup.stopProcess();      // close opened descriptors, unmap frame buffers

    qputenv("QT_QPA_EGLFS_FB", "dev/fb1");              // redirects QT to use fb1 (overlay) and gstreamer will go to fb0

    GstWorker gstworker;
    QQuickView view;

    view.engine()->rootContext()->setContextProperty("thread", &gstworker);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    gst_deinit();

    return app.exec();
}

函数调用列表(堆栈)显示以下跟踪:

1  __GI_raise                               raise.c          54   0xb5ae1910 
2  __GI_abort                               abort.c          89   0xb5ae2ca0 
3  qt_message_fatal                         qlogging.cpp     1687 0xb5e0fff8 
4  QMessageLogger::fatal                    qlogging.cpp     795  0xb5e0fff8 
5  qt_pixmap_thread_test                    qpixmap.cpp      74   0xb670ce98 
6  QPixmap::QPixmap                         qpixmap.cpp      109  0xb670ce98 
7  QCursorData::QCursorData                 qcursor.cpp      624  0xb66a3360 
8  QCursorData::initialize                  qcursor.cpp      655  0xb66a3360 
9  QCursor::QCursor                         qcursor.cpp      470  0xb66a3360 
10 QWindowPrivate::QWindowPrivate           qwindow_p.h      107  0xb6bb3a78 
11 QQuickWindowPrivate::QQuickWindowPrivate qquickwindow.cpp 501  0xb6bb3a78 
12 QQuickViewPrivate::QQuickViewPrivate     qquickview.cpp   77   0xb6c306e0 
13 QQuickView::QQuickView                   qquickview.cpp   166  0xb6c30778 
14 main                                     main.cpp         38   0x131c8    

我的问题是我需要解决什么才能摆脱sigabt信号 感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

当我再次遇到错误时,我注意到在声明QQuickView对象时实际上正在发生此错误。我将main.cpp更改为使用QQmlApplicationEngine(而不是创建快速查看引擎)来设置上下文,并且错误不再发生。

仅供参考:SIGABT错误在消息框中给出,仅此而已。

我想感谢@ m7913d为解决此问题提供的帮助。