我目前有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上?
谢谢!
答案 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);