Qt: QWidgets и указатели

В настоящее время у меня есть 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?

Спасибо!

1

Решение

На самом деле, двойной указатель на базовый класс не может использоваться как двойной указатель на производный класс; поэтому вам, вероятно, придется прибегнуть к шаблонам:

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

// called like this:
deleteAndCleanup(m_x);
2

Другие решения

Проблема здесь не столько в том, что вы хотите удалить 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();
}
}
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector