2

我目前有 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并调用 asdeleteScreen(m_x)它将删除内存但不会设置m_x为 NULL。(仅局部变量,小部件)

-> 有没有办法让deleteScreen函数删除给定的小部件并将成员变量的值设置为 NULL?

谢谢!

4

2 回答 2

3

实际上,指向基类的双指针不能用作指向派生类的双指针;所以你可能不得不求助于模板:

template<typename T>
void deleteAndCleanup(T*& ptr)
{
    delete ptr;
    ptr = NULL;
}

// called like this:
deleteAndCleanup(m_x);
于 2013-09-01T11:52:47.197 回答
3

这里的问题不在于您要删除 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();
    }
}
于 2013-09-01T13:23:57.607 回答