我目前尝试在Qt 4.8程序中显示一些简单的3D场景。 Ubuntu和openSUSE上都可用的库是OpenSceneGraph。我下载了QOsgWidget课程并将其添加到我的课程中。在运行时期间,我打开一个新窗口,并将QOsgWidget
的默认构造实例添加到QWidget
的布局中。它在调试版本中直接崩溃。当我在gdb
中运行时,我可以看到新的打开窗口,其中似乎有一个“洞”,我可以看到我的背景图片,但是当我移动窗口时这不会更新。
当我试图获得回溯时,我没有将错误链接到我的任何代码:
(gdb) bt
#0 0x00007fffcdd68f4f in ?? () from /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
#1 0x00007fffcdcf6bd0 in ?? () from /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
#2 0x00007fffed0e15ae in osgUtil::RenderStage::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) () from /usr/lib/x86_64-linux-gnu/libosgUtil.so.100
#3 0x00007fffed0e0587 in osgUtil::RenderStage::drawInner(osg::RenderInfo&, osgUtil::RenderLeaf*&, bool&) () from /usr/lib/x86_64-linux-gnu/libosgUtil.so.100
#4 0x00007fffed0e244f in osgUtil::RenderStage::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) () from /usr/lib/x86_64-linux-gnu/libosgUtil.so.100
#5 0x00007fffed0ea32c in osgUtil::SceneView::draw() () from /usr/lib/x86_64-linux-gnu/libosgUtil.so.100
#6 0x00007ffff518a837 in osgViewer::Renderer::draw() () from /usr/lib/x86_64-linux-gnu/libosgViewer.so.100
#7 0x00007ffff4b70f19 in osg::GraphicsContext::runOperations() () from /usr/lib/x86_64-linux-gnu/libosg.so.100
#8 0x00007ffff4bc1da8 in osg::OperationThread::run() () from /usr/lib/x86_64-linux-gnu/libosg.so.100
#9 0x00007ffff4b73158 in osg::GraphicsThread::run() () from /usr/lib/x86_64-linux-gnu/libosg.so.100
#10 0x00007fffecda5718 in OpenThreads::ThreadPrivateActions::StartThread(void*) () from /usr/lib/x86_64-linux-gnu/libOpenThreads.so.20
#11 0x00007ffff34f96aa in start_thread (arg=0x7fffca55b700) at pthread_create.c:333
#12 0x00007ffff3816eed in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
这是我创建实例的代码:
在文件window3d.h
中:
#include "QOsgWidget.h"
#include <QWidget>
namespace Ui {
class Window3D;
}
class Window3D : public QWidget {
Q_OBJECT
public:
explicit Window3D(QWidget *parent,
const std::vector<std::vector<Circles>> &all_circles);
~Window3D();
private:
Ui::Window3D *ui;
const std::vector<std::vector<Circles>> &all_circles;
QOsgWidget osg;
};
相应的来源:
#include "window3d.h"
#include "ui_window3d.h"
Window3D::Window3D(QWidget *parent,
const std::vector<std::vector<Circles>> &all_circles)
: QWidget(parent), ui(new Ui::Window3D), all_circles{all_circles} {
ui->setupUi(this);
}
Window3D::~Window3D() {
delete ui;
}
主窗口类有一个菜单操作槽,如下所示:
void MainWindow::open_3d() {
window_3d.reset(new Window3D(nullptr, sm.all_circles));
window_3d->show();
}
成员window_3d
是std::unique_ptr<Window3D>
。
由于除了使用下载的QOsgWidget
并创建它的实例之外,我实际上并没有做任何事情,我不明白为什么它会崩溃。
有没有办法通过调试工具更接近错误,还是需要在OpenSceneGraph文档中的某处找到此错误?
我看到每次让应用程序在调试模式下运行时都会出现不同的错误消息。我在函数的开头添加了输出,以显示它是否正常工作。此次运行与SIGSEGV崩溃:
QOsgWidget::ctor
QOsgWidget::setupContext()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
我再次尝试,在以下输出后,窗口实际显示,但我无法关闭它:
QOsgWidget::ctor
QOsgWidget::setupContext()
QOsgWidget::frame()
QOsgWidget::frame()
下次我收到SIGABRT:
QOsgWQOsgWidget::ctor
QOsgWidget::setupContext()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
megrama-qt: ../../src/xcb_io.c:179: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.idget::frame()
在下一次运行中,我得到另一个SIGSEGV,这次有更多frame()
次呼叫
QOsgWidget::ctor
QOsgWidget::setupContext()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
这种随机特性看起来像是一个线程问题。
当我从GitHub存储库编译项目时,它在我的系统上使用Qt 5进行编译,但也在我的系统上使用SIGSEGV崩溃。