3

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! */ }

驚いたことに (これは非常に複雑なウィジェットなので、おそらくありがたいことに)、これはまったく同じセグメンテーション違反を引き起こします! また、単にインスタンス化するのではなくNodeEditBoxwithへのポインターを作成しようとしました。また、ツールバー クラスの a ポインター メンバーを作成し、それを以前に構築しました (したがって、 でのみ実行しました。また、親と GLWidget シーン ポインターは既に作成されています。私の知る限りでは、堅牢ですが、それでも毎回同じ問題が発生します。newNodeEditBoxexecShowNodeEditBox()

ここで何が欠けていますか?

**その他の情報/編集:QDialogカスタム バージョンの代わりに通常の空のポップアップを使用すると、問題なく動作します。だから、それは親に関係があるのか​​もしれません。

さらに興味深いことに、代わりにNodeEditBoxから派生すると問題なく動作し、クラッシュしません! を使用したかったのですが、ツールバークラスのメンバーでない限り、呼び出しが機能しないように見えます。これは、さまざまな場所にポップアップする複数の「使い捨て」ノード編集ボックスが必要なため、必要ありませんでした。回...QWidgetQDialogQDialogexec. showNodeEditBox

4

2 に答える 2

1

する必要があります

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

それ以外の

NodeEditBox::NodeEditBox(QWidget* _parent, GLWidget* _scene){ /* nothing! */ }
  • 入力引数を渡す必要があります。その他のデフォルト ctor は、親が 0 の下位ウィジェットに対して呼び出されます。これにより segfault が発生するかどうかは 100% 確実ではありませんが、エラーが発生しやすいことは間違いありません。
于 2013-09-13T15:09:26.370 に答える
0

これを解決するのに十分な情報がここにあるとは思わないので、絞り込むために私が行うことは次のとおりです。

  1. make cleanきしむようなクリーン ビルド (つまり、など)からこのクラッシュを再現できることを確認してください。「謎の」クラッシュは、クリーンでないビルド (古いオブジェクト/moc ファイルなど) によって引き起こされることがあります。

  2. NodeEditBox の簡単なバージョンから始めて、クラッシュに向けて作業します。コンストラクターは既にスタブアウトしています。他のすべてのメソッドとメンバーについても同じことを行います。それらをすべてコメントアウトしてから、1 つずつ元に戻して、クラッシュする最小バージョンを見つけます。それでも意味がわからない場合は、その最小バージョンを投稿してください。

  3. 代替の実装で脇道にそれないでください - あなたが提示したコードは問題ないように見えます - あなたはそれを動作させることができるはずです. クラッシュの原因は、ここに示していないコードにあるはずです。

于 2013-09-14T00:50:36.420 に答える