c++ - 自定义 QDialog 在 exec() 时导致段错误

标签 c++ qt segmentation-fault qdialog custom-widgets

我有一个程序,它基本上由一个中央 QMainWindow 和一个成员 QToolbar 指针组成。

此工具栏上的一个操作将其触发 信号连接到 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 本身的构造非常复杂(到处都是很多 slider 、标签等),所以我尝试将其全部清除并在一个空的自定义框上调用 exec,构造如下这个:

NodeEditBox::NodeEditBox(QWidget* _parent, GLWidget* _scene){ /* nothing! */ }

瞧瞧(也许谢天谢地,因为它是一个非常复杂的小部件),这会导致完全相同的段错误!我还尝试使用 new 创建一个指向 NodeEditBox 的指针,而不是仅仅实例化它,以及使 NodeEditBox 成为工具栏的指针成员类并更早地构建它(因此,仅在 ShowNodeEditBox() 中执行 exec。并且父级和 GLWidget 场景指针已经创建、说明并且稳健,就我知道。但我每次仍然遇到同样的问题。

我在这里错过了什么?

**其他信息/编辑:使用常规的空 QDialog 并弹出它而不是自定义版本就可以了。所以这可能与 parent 有关。

更有趣的是,从 QWidget 而不是 QDialog 派生 NodeEditBox 工作得很好而且不会崩溃!不过,我想使用 QDialog,这样我就可以调用 exec. show 似乎不起作用,除非 NodeEditBox 是工具栏类的成员,我不想要它,因为我需要多个“一次性”节点编辑框在不同时间弹出...

最佳答案

应该是

NodeEditBox::NodeEditBox(QWidget* _parent, GLWidget* _scene)
: QDialog(parent)
{ /* nothing! */ }

代替

NodeEditBox::NodeEditBox(QWidget* _parent, GLWidget* _scene){ /* nothing! */ }
  • 您需要传递输入参数,另外默认构造函数被调用用于底层小部件,父级为 0。不能 100% 确定这是否会导致段错误,但绝对容易出错。

关于c++ - 自定义 QDialog 在 exec() 时导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18788597/

相关文章:

c - 递归指针的段错误

c++ - 是否可以在容器中放置 std::array?如果是怎么样?如果不是,为什么?

c++ - 让 Cairo 图形与 MFC 一起工作的小例子?

qt - 如何获取tableView中某个值的索引?

Qt:如何知道 QMdiSubWindow 何时关闭?

c++ - 在看似简单的操作上导致 vector<int> 中的 push_back 出现段错误

c++ - 如何清除输入流缓冲区

c++ - 令人困惑的 Valgrind 输出 : indirectly lost blocks but no errors?

c++ - 使用 MSYS2/Mingw32 编译 gRPC

为我的结构的 char 成员赋值时出现 C 段错误