[英]Qt: QWidgets and Pointers
我目前有3個公開的QWidgets類。 -> x,y,z都是qwidgets。
在主窗口中,我有指向x,y,z的指針。
因此,成員:
X* m_x;
Y* m_y;
Z* m_z;
成員函數:
void MainWindow::deleteScreen(QWidget** widget)
{
if(widget != NULL)
{
delete widget;
widget = NULL;
}
}
稱為: deleteScreen(&m_x);
->導致無效的轉換。
如果將deleteScreen
參數更改為QWidget* widget
並以deleteScreen(m_x)
調用,它將刪除內存,但不會將m_x
設置為NULL。 (僅局部變量,小部件)
->有什么方法可以使deleteScreen
函數刪除給定的小部件並將成員變量的值設置為NULL?
謝謝!
這里的問題不僅僅在於您要刪除QWidget,還在於您使用指向它們的指針來確定它們是否已被刪除。
Qt為此提供了解決方案。 對於QObject
類,可以將QPointer
類用作防護。 通過內部連接到對象的刪除,可以知道它包含的QObject
是否已刪除。
嘗試以下方法替代您的代碼:
QPointer<X> m_x;
QPointer<Y> m_y;
QPointer<Z> m_z;
template<typename T>
void MainWindow::deleteScreen(QPointer<T> &widget)
{
if(!widget.isNull() && qobject_cast<QWidget>(widget) != 0)
{
widget->deleteLater();
}
}
實際上, 指向基類的雙指針不能用作指向派生類的雙指針 。 因此,您可能必須求助於模板:
template<typename T>
void deleteAndCleanup(T*& ptr)
{
delete ptr;
ptr = NULL;
}
// called like this:
deleteAndCleanup(m_x);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.