簡體   English   中英

Qt:QWidgets和指針

[英]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.

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