В настоящее время у меня есть 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?
Спасибо!
На самом деле, двойной указатель на базовый класс не может использоваться как двойной указатель на производный класс; поэтому вам, вероятно, придется прибегнуть к шаблонам:
template<typename T>
void deleteAndCleanup(T*& ptr)
{
delete ptr;
ptr = NULL;
}
// called like this:
deleteAndCleanup(m_x);
Проблема здесь не столько в том, что вы хотите удалить 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();
}
}