Qt:QWidgets和指针

时间:2013-09-01 11:18:27

标签: c++ qt pointers null

我目前有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 param更改为QWidget* widget并调用deleteScreen(m_x),它将删除内存,但不会将m_x设置为NULL。 (只有局部变量,小部件)

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

谢谢!

2 个答案:

答案 0 :(得分:3)

这里的问题并不是你想要删除QWidgets,而是你正在使用它们的指针来确定它们是否已被删除。

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();
    }
}

答案 1 :(得分:2)

实际上,a double pointer to a base class cannot be used as a double pointer to a derived class;所以你可能不得不求助于模板:

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

// called like this:
deleteAndCleanup(m_x);