0

プログラムが returncode 0 でクラッシュし続けます。原因は qtabwidget のどこかにありますが、エラーが見つかりません。

 QTabWidget *layout_tabs;

// create tabs
void myclass::fill_tabs(void)
{
  kill_tabs(); // remove old tabs 
  layout_tabs = new QTabWidget();

  // program adds content into a few tabs, like:
  // widgets created, content created, put into layout, put into widget..
  layout_tabs->addTab(widget, "description");
  layout_tabs->addTab(widget2, "description2");

  layout_tabs->show();
}

void myclass::kill_tabs(void)
{
  if(layout_tabs==nullptr)
    return;
  layout_tabs->hide();

  QWidget *window;

  for ( int i=layout_tabs->count()-1; i>=0; --i)
    {
        window = layout_tabs->widget(i); // remember widget
        layout_tabs->removeTab(i); // remove tab
        free(window); // remove widget
    }

  free(layout_tabs); // remove qtabwidget
  layout_tabs=nullptr;
}

filltabs() 関数が数回使用されます。古いタブウィジェットは破棄され、新しいタブウィジェットが作成されます。タブウィジェットを削除しなくても問題ありませんが、タブのみを削除します。プログラムは引き続きリターンコード 0 で終了します。

4

2 に答える 2

1

呼び出しますfree(layout_tabs)が、で割り当てますoperator new()。代わりに割り当てを解除する必要がありますdelete layout_tabs。変数がどのように割り当てられているかわかりませんが、変数のwindow割り当てを解除する必要があるoperator delete()かどうか、または自分のメモリをQTabWidget所有しているかどうか(つまり、そのメモリの管理を担当しているかどうか)を確認する必要があります。

于 2013-02-20T22:22:32.777 に答える
0

QApplication::quitOnLastWindowClosedを false に設定します。

#include <QApplication>

// ...

qApp->setQuitOnLastWindowClosed (false);

または、タブ (メイン ウィンドウ/メイン ウィジェット) のコンテナーを設定して、プロパティQt::WA_QuitOnCloseを false に設定することもできます。

myWidget->setAttribute(Qt::WA_QuitOnClose, false);

それらのいずれかがそれを修正する必要があります。また、「0」を返すことはクラッシュではありません。通常、ゼロは通常の終了を示します。

http://qt-project.org/doc/qt-4.8/qapplication.html#quitOnLastWindowClosed-prop

http://qt-project.org/doc/qt-4.8/qt.html#WidgetAttribute-enum

于 2013-02-12T02:57:49.767 に答える