我有一个程序,它基本上由一个中心指针QMainWindow
和一个成员QToolbar
指针组成。
此工具栏上的一个操作将其triggered
信号连接到一个ShowNodeEditBox()
插槽,该插槽实例化并尝试执行自定义QDialog
派生的小部件:
void
Toolbar::ShowNodeEditBox(){
...
//Side note: The custom box stores a pointer to a custom QGLWidget on the main window
NodeEditBox nodeEdit(this, m_mainWindow->GetGLScene());
nodeEdit.exec();
}
出于某种原因,调用 exec 会导致段错误,即使只是在没有它的情况下构造窗口也可以正常工作。堆栈跟踪如下:
#0 0x0000000000000000 in ?? ()
#1 0x00000030922e64ff in ?? () from /usr/lib64/libQtGui.so.4
#2 0x00000030922e795a in QPainter::QPainter(QPaintDevice*) () from /usr/lib64/libQtGui.so.4
#3 0x00000030921fd7af in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) ()
from /usr/lib64/libQtGui.so.4
#4 0x00000030923a0675 in ?? () from /usr/lib64/libQtGui.so.4
#5 0x00000030923a09c9 in ?? () from /usr/lib64/libQtGui.so.4
#6 0x00000030922162da in ?? () from /usr/lib64/libQtGui.so.4
#7 0x00000030922213e7 in QApplication::x11ProcessEvent(_XEvent*) () from /usr/lib64/libQtGui.so.4
#8 0x0000003092249da2 in ?? () from /usr/lib64/libQtGui.so.4
#9 0x00007ffff7410f0e in g_main_context_dispatch () from /lib64/libglib-2.0.so.0
#10 0x00007ffff7414938 in ?? () from /lib64/libglib-2.0.so.0
#11 0x00007ffff7414a3a in g_main_context_iteration () from /lib64/libglib-2.0.so.0
#12 0x0000003091b7d5f3 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#13 0x0000003092249a6e in ?? () from /usr/lib64/libQtGui.so.4
#14 0x0000003091b56722 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#15 0x0000003091b569ec in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#16 0x000000309262aaae in QDialog::exec() () from /usr/lib64/libQtGui.so.4
#17 0x000000000045d9e8 in RoadmapOptions::ShowNodeEditBox (this=0xce5da0) at GUI/RoadmapOptions.cpp:562
#18 0x0000000000486f32 in RoadmapOptions::qt_metacall (this=0xce5da0, _c=QMetaObject::InvokeMetaMethod, _id=12, _a=0x7fffffffc740)
at GUI/MOC/moc_RoadmapOptions.cpp:114
肯定有东西在这里,因为我看到一个 0x0,但我无法弄清楚。它本身的构造NodeEditBox
非常复杂(到处都有很多滑块、标签等),所以我尝试将其全部清除,然后在一个空的自定义框上调用 exec,构造如下:
NodeEditBox::NodeEditBox(QWidget* _parent, GLWidget* _scene){ /* nothing! */ }
你瞧(也许值得庆幸的是,因为它是一个非常复杂的小部件),这会导致完全相同的段错误!我还尝试创建一个指向 a 的指针NodeEditBox
,new
而不仅仅是实例化它,以及制作NodeEditBox
工具栏类的 a 指针成员并更早地构造它(因此,只做exec
in ShowNodeEditBox()
。并且父级和 GLWidget 场景指针已经创建,占据我所知,为,而且很健壮。但我每次仍然遇到同样的问题。
我在这里想念什么?
**其他信息/编辑:使用常规的、空的QDialog
并弹出它而不是自定义版本就可以了。所以这可能是与父母有关的事情。
更有趣的是,从而不是派生NodeEditBox
就QWidget
可以QDialog
正常工作并且不会崩溃!不过,我想使用QDialog
,因此我可以调用exec.
show
似乎不起作用,除非它NodeEditBox
是工具栏类的成员,我不想要它,因为我需要多个“一次性”节点编辑框以不同的方式弹出次...