2013-07-30 57 views
0

我正在使用FlowLayout示例qt使用上下文菜單從佈局中刪除本身

我爲FlowLayout中的所有項目添加了一個上下文菜單,以啓用重命名和刪除。重命名工作,但每當我打電話刪除,我收到一個分段錯誤。

這裏是removeSlot呼叫:

QAction *removeAction = new QAction(tr("Remove"), this); 
    connect(removeAction, SIGNAL(triggered()), this, SLOT(removeSlot())); 
    Menu->addAction(removeAction); 

併發射信號:

void FlowLayoutWidget::removeSlot() 
{ 
    emit removeMe(m_ownId); 
} 

FlowWindow.cpp捕獲信號,並執行下面的代碼:

void FlowWindow::removeItemAt(int _index) 
{ 

    while(QLayoutItem* item = flowLayout->itemAt(_index)) 
    { 
     QWidget* widget = item->widget(); 
     flowLayout->removeWidget(widget); 
     delete widget; 
     break; 

    } 
} 

每當此功能被稱爲,我收到一個分割錯誤。我該如何解決這個問題?

回答

1

您對由該對象觸發的插槽內的對象調用delete。有時候這可能會產生問題,但並不總是顯而易見的。我懷疑這種情況可能會導致你的問題。 Qt提供了方法QObject::deleteLater(),它通過在控制返回到事件循環之後調度要刪除的對象來處理此問題。

void FlowWindow::removeItemAt(int _index) 
{ 

    while(QLayoutItem* item = flowLayout->itemAt(_index)) 
    { 
     QWidget* widget = item->widget(); 
     flowLayout->removeWidget(widget); 
     //delete widget; avoid this 
     widget.deleteLater(); //try this instead 
     break; 

    } 
} 

請參閱this question/answer瞭解更多信息。

另外,我會注意到,由於您正在刪除(或刪除)對象,因此您不需要明確調用flowLayout->removeWidget(widget) - 它將自動處理對象何時被銷燬。

+0

謝謝:)。這解決了分割錯誤問題。你能告訴我如何通過'itemAt'獲得索引以正確刪除該項目?我可以迭代流佈局嗎? – www

+0

這是一個不同的話題,所以它應該是它自己的問題。當你問這個問題時,一定要顯示你已經嘗試了什麼,以及你發現了什麼。 (這可以自己解決。) – tmpearce

+0

Ops。這是因爲索引沒有被更新。現在一切都很清楚。 – www

相關問題