簡體   English   中英

你能把QWidgets放在堆棧上嗎?

[英]Can you put QWidgets on the stack?

背景故事:

我檢查了一些代碼,然后我創建了一個本地QMessageBox來顯示錯誤,並將其分配給堆:

if (getAutopilotList.error() == 0) {
    QMessageBox* error = new QMessageBox(0);
    error->setDetailedText(getAutopilotList.errorString());
    error->setText("something");
    error->setWindowTitle(tr("Error!"));
    error->show();
    return;
}

開發商說:

此指針將泄漏,您沒有設置父項,您永遠不會刪除它。 在這里你也不需要指針。 至於父級不使用0,而是使用Core :: ICore :: mainWindow()。

我很困惑,因為我想:

  1. QWidgets僅適用於堆
  2. 指針會delete error; 消息框關閉時自動

我嘗試將QMessageBox放在堆棧上,但它沒有顯示。


問題:

  1. 我可以把這個QMessageBox放在堆棧上並讓它工作,我應該嗎?
  2. 我是否需要顯式delete QMessageBox指針?
  3. 為什么在這種情況下將父級設置為0以上的重要內容?

我嘗試將QMessageBox放在堆棧上,但它沒有顯示。

因為當線程超出范圍時它會立即被銷毀。 您必須使用QMessageBox::exec()以塊模式運行它。

原則上,您可以在堆棧上創建QWidget對象。 在這里,它不起作用,因為對error->show()的調用不會立即顯示消息框,它只是在返回主even循環時調度顯示,此時對象將被銷毀。 因此, delete QMessageBox也無法正常工作。 當父本身被破壞時,設置父對象會將對象銷毀的責任性賦予父對象,這是一個好主意。

但是,如果我了解您要執行的操作,則需要等待用戶在return之前單擊“確定”按鈕。 如果是這種情況,您最好使用靜態QMessageBox函數,例如QMessageBox :: warning

如果你想要一個持久性消息框,那么你的代碼是正常的,但你應該添加以下調用:

error->setAttribute(Qt::WA_DeleteOnClose);

這將在相應窗口關閉時觸發刪除。

堆棧上的QWidget工作,但在大多數情況下不實用,因為當保留范圍時,刪除堆棧上的對象。

看看任何(很多)Qt示例,你會發現這個模式:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);   
    MainWindow window; //inherits from QWidget, created on stack
    window.show();    
    return app.exec();
}

1)關於“堆棧上的QWidget”這個問題 - 它應該是證明,它是有效的和官方的。 但是這次和QDialog :: exec再次是堆棧上QWidgets的唯一用例。

2)它不會傷害。 如果您的編碼規則要求為每個新調用刪除 - 請執行此操作。 否則,正確設置Qt :: WA_DeleteOnClose,並在關閉時將其刪除。

3)關於父0:當丟失對具有父項的指針的引用時,您是安全的。 如果刪除父項,則會自動刪除所有子項(也可能已被遺忘)。 因此對於長期運行的應用程序,“內存泄漏”只是暫時的。 使用parent = 0,它不會在c ++意義上泄漏,這使得內存檢查器無法檢測到此類泄漏。 仍然可以使用一些QObject樹遍歷函數訪問指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM