QMainWindow
基本的にセントラル ポインターとメンバーポインターで構成されるプログラムがありQToolbar
ます。
このツールバーの 1 つのアクションには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
は非常に複雑です (たくさんのスライダー、ラベルなどがいたるところにあります)。
NodeEditBox::NodeEditBox(QWidget* _parent, GLWidget* _scene){ /* nothing! */ }
驚いたことに (これは非常に複雑なウィジェットなので、おそらくありがたいことに)、これはまったく同じセグメンテーション違反を引き起こします! また、単にインスタンス化するのではなくNodeEditBox
withへのポインターを作成しようとしました。また、ツールバー クラスの a ポインター メンバーを作成し、それを以前に構築しました (したがって、 でのみ実行しました。また、親と GLWidget シーン ポインターは既に作成されています。私の知る限りでは、堅牢ですが、それでも毎回同じ問題が発生します。new
NodeEditBox
exec
ShowNodeEditBox()
ここで何が欠けていますか?
**その他の情報/編集:QDialog
カスタム バージョンの代わりに通常の空のポップアップを使用すると、問題なく動作します。だから、それは親に関係があるのかもしれません。
さらに興味深いことに、代わりにNodeEditBox
から派生すると問題なく動作し、クラッシュしません! を使用したかったのですが、ツールバークラスのメンバーでない限り、呼び出しが機能しないように見えます。これは、さまざまな場所にポップアップする複数の「使い捨て」ノード編集ボックスが必要なため、必要ありませんでした。回...QWidget
QDialog
QDialog
exec.
show
NodeEditBox