[英]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()。
我很困惑,因為我想:
delete error;
消息框關閉時自動 我嘗試將QMessageBox放在堆棧上,但它沒有顯示。
delete
QMessageBox指針? 我嘗試將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.