destructors in Qt4

后端 未结 5 1086
小鲜肉
小鲜肉 2020-12-31 11:17

I\'m very confused about using destructors in Qt4 and hope, you guys can help me.
When I have a method like this (with \"Des\" is a class):

void Widget::         


        
相关标签:
5条回答
  • 2020-12-31 12:05

    Another option to using deleteLater(), or parents, is to use the delete-on-close functionality for widgets. In this case, Qt will delete the widget when it is done being displayed.

    Des *test = new Des;
    test->setAttribute( Qt::WA_DeleteOnClose );
    test->show();
    

    I like to use it with the object tree that Qt keeps, so that I set delete-on-close for the window, and all widgets in the window have a proper parent specified, so they all get deleted as well.

    0 讨论(0)
  • 2020-12-31 12:11

    Qt uses what they call object trees and it's a bit different from the typical RAII approach.

    The QObject class constructor takes a pointer to a parent QObject. When that parent QObject is destructed, its children will be destroyed as well. This is a pretty prevalent pattern throughout Qt's classes and you'll notice a lot of constructors accept a *parent parameter.

    If you look at some of the Qt example programs you'll find that they actually construct most Qt objects on the heap and take advantage of this object tree to handle destruction. I personally found this strategy useful as well, as GUI objects can have peculiar lifetimes.

    Qt provides no additional guarantees beyond standard C++ if you're not using QObject or a subclass of QObject (such as QWidget).


    In your particular example there's no guarantee that anything gets deleted.

    You'll want something like this for Des (assuming Des is a subclass of QWidget):

    class Des : public QWidget
    {
        Q_OBJECT
    
    public:
        Des(QWidget* parent)
        : QWidget(parent)
        {
            QPushButton* push = new QPushButton("neu");
            QHBoxLayout* layout = new QHBoxLayout(this);
            layout->addWidget(push); // this re-parents push so layout 
                                     // is the parent of push
            setLayout(layout);
        }
    
        ~Des()
        {
            // empty, since when Des is destroyed, all its children (in Qt terms)
            // will be destroyed as well
        }
    }
    

    And you'd use class Des like so:

    int someFunction()
    {
        // on the heap
        Des* test = new Des(parent); // where parent is a QWidget*
        test->show();
        ...
        // test will be destroyed when its parent is destroyed
    
        // or on the stack
        Des foo(0);
        foo.show();
        ...
        // foo will fall out of scope and get deleted
    }
    
    0 讨论(0)
  • 2020-12-31 12:11

    Richardwb's answer is a good one - but the other approach is to use the deleteLater slot, like so:

    Des *test = new Des;
    test->show();
    connect(test, SIGNAL(closed()), test, SLOT(deleteLater()));
    

    Obviously the closed() signal can be replaced with whatever signal you want.

    0 讨论(0)
  • 2020-12-31 12:13

    This tutorial suggests you don't need to explicitly delete widgets that have been added to parent widgets. It also says it doesn't hurt to do delete them either.

    (I've not tested this, but I guess as long as you explicitly delete them before the parent widget is deleted, this should be OK.)

    0 讨论(0)
  • 2020-12-31 12:13

    In most cases you should create widgets on the stack:

        QPushButton push("neu");
    

    This way, they get deleted when they become out of scope. If you really want to create them on the heap, then it's your responsibility to call delete on them when they are not needed anymore.

    0 讨论(0)
提交回复
热议问题