Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:QWidgets和指针_C++_Qt_Pointers_Null - Fatal编程技术网

C++ Qt:QWidgets和指针

C++ Qt:QWidgets和指针,c++,qt,pointers,null,C++,Qt,Pointers,Null,我目前有3个类是公共QWidgets。 ->x,y,z都是qwidget 在我的主窗口中,我有指向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(&

我目前有3个类是公共QWidgets。 ->x,y,z都是qwidget

在我的主窗口中,我有指向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
设置为空。(仅局部变量,小部件)

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

谢谢大家!

实际上,;因此,您可能必须求助于模板:

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

// called like this:
deleteAndCleanup(m_x);
模板
无效删除和清除(T*&ptr)
{
删除ptr;
ptr=NULL;
}
//这样称呼:
删除和清除(m_x);
实际上,
;因此,您可能必须求助于模板:

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

// called like this:
deleteAndCleanup(m_x);
模板
无效删除和清除(T*&ptr)
{
删除ptr;
ptr=NULL;
}
//这样称呼:
删除和清除(m_x);

这里的问题不是您想删除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();
    }
}
QPointer m_x;
QPointer m_y;
QPointer m_z;
模板
void主窗口::删除屏幕(QPointer和小部件)
{
如果(!widget.isNull()&&qobject_cast(widget)!=0)
{
widget->deleteLater();
}
}

这里的问题不是您想删除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();
    }
}
QPointer m_x;
QPointer m_y;
QPointer m_z;
模板
void主窗口::删除屏幕(QPointer和小部件)
{
如果(!widget.isNull()&&qobject_cast(widget)!=0)
{
widget->deleteLater();
}
}


if(widget!=null&&*widget!=null){
delete*widget;*widget=null;}
您确定必须删除Qwidget吗?好的,Qt实现了某种垃圾收集。Qt没有垃圾收集功能,但QObject是复合模式的实现,因此删除父对象时会删除所有子对象。我是否可以添加注释,在删除它之前不必测试空指针?删除空指针实际上定义得很好,并且可以。。。。没有什么。因此,删除if(widget!=NULL)。这是多余的,会使您的代码看起来不那么专业。;-)如果您真的想“删除”它并分配一个空值,为什么不使用引用呢。void main window::deleteScreen(QWidget*&widget)如果(widget!=null&&*widget!=null){
delete*widget;*widget=null;}
您确定必须删除QWidget吗?好的,Qt实现了某种垃圾收集。Qt没有垃圾收集功能,但QObject是复合模式的实现,因此删除父对象时会删除所有子对象。我是否可以添加注释,在删除它之前不必测试空指针?删除空指针实际上定义得很好,并且可以。。。。没有什么。因此,删除if(widget!=NULL)。这是多余的,会使您的代码看起来不那么专业。;-)如果您真的想“删除”它并分配一个空值,为什么不使用引用呢。void MainWindow::deleteScreen(QWidget*&widget)您不需要在引用的版本中检查NULL。在空指针上调用delete完全可以。(当然,您仍然需要在接受指针的版本中检查NULL,因为它会被取消引用。)@NikosC.:它们中的任何一个都不需要NULL检查;如果双指针为NULL,则调用者中存在严重的逻辑缺陷,因此segfault是非常值得的。嘿,我尝试了第一种解决方案,但这导致无效转换:错误:从“X**”到“QWidget**”的转换无效[-fpPermissive]第二个解决方案还提供了一个错误:错误:调用“MainWindow::deleteScreen(X*&)”时没有匹配的函数@secondVISION:第二个解决方案提供了该错误,因为您没有更新
块内的声明,但它遇到了与第一个相同的问题(不能使用对指向基类的指针的引用来传递指向派生类的指针);有关替代解决方案,请参阅更新的答案。不需要在引用的版本中检查NULL。对NULL指针调用delete完全可以。(当然,您仍然需要在使用指针的版本中检查NULL,因为它会被取消引用。)@NikosC.:它们中的任何一个都不需要NULL检查;如果双指针为NULL,则调用者中存在严重的逻辑缺陷,因此segfault是非常值得的。嘿,我尝试了第一个解决方案,但这给了我无效的转换:错误:从“X**”到“QWidget**”的无效转换[-fpermissive]第二个解决方案还提供了一个错误:错误:调用“MainWindow::deleteScreen(X*&)”时没有匹配的函数@secondVISION:第二个解决方案提供了该错误,因为您没有更新
块内的声明,但它遇到了与第一个相同的问题(不能使用指向基类的指针的引用来传递指向派生类的指针);请参阅更新的答案以获得替代解决方案。我认为
&&qobject_cast(widget)!=0
部分没有真正的用处