سؤال

أنا في حيرة من أمري حول استخدام المتلفات في Qt4 وآمل يا رفاق يمكن أن تساعد لي.
عندما يكون لدي طريقة مثل هذا (مع "Des" هي فئة):

void Widget::create() {
    Des *test = new Des;
    test->show();
}

كيف يمكنني التأكد من أن هذه القطعة سوف يتم حذفها بعد أن كان مغلقا ؟

وفي فئة "Des" لدي هذا:

Des::Des()
{
    QPushButton *push = new QPushButton("neu");
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(push);
    setLayout(layout);
}

أين و كيف يجب أن حذف *دفع *تخطيط ؟ ما ينبغي أن يكون في المدمر Des::~Des() ?

هل كانت مفيدة؟

المحلول

وثمة خيار آخر لاستخدام deleteLater()، أو الآباء، هو استخدام وظيفة الحذف على وثيقة لالحاجيات. في هذه الحالة، سوف كيو تي حذف القطعة عندما يتم ذلك يتم عرضها.

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

وأود أن استخدامه مع شجرة الكائن الذي يحافظ كيو تي، بحيث أحدد حذف على وثيقة للإطار، وجميع الحاجيات في الإطار يكون أحد الوالدين الصحيح المحدد، لذلك هم جميعا الحصول على حذف أيضا.

نصائح أخرى

يستخدم

وكيو تي ما يسمونه الأشجار الكائن و الأمر مختلف قليلا من النهج RAII نموذجي.

QObject href="https://doc.qt.io/qt-5/qobject.html#QObject" rel="nofollow noreferrer"> منشئ يأخذ مؤشر إلى QObject الأم . عندما دمر أن QObject الوالدين، وسيتم تدمير الأطفال كذلك. هذا هو النمط السائد جميلة طوال فصول كيو تي وستلاحظ الكثير من المنشئات قبول المعلمة *parent.

إذا نظرتم الى بعض كيو تي سبيل المثال برامج عليك تجد أنها في الواقع بناء معظم الكائنات كيو تي في كومة والاستفادة من هذه الشجرة الكائن لمعالجة الدمار. شخصيا وجدت هذه الاستراتيجية مفيدة أيضا، ككائنات GUI يمكن أن يكون عمر غريبة.

وكيو تي لا يقدم أي ضمانات إضافية تتجاوز معيار C ++ إذا كنت لا تستخدم QObject أو فئة فرعية من QObject (مثل QWidget).


في المثال معينة ليس هناك ضمان أن أي شيء يحصل حذف.

وأنت تريد شيئا من هذا القبيل لDes (على افتراض Des هو فئة فرعية من 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
    }
}

وكنت تستخدم الطبقة Des مثل ذلك:

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
}

والجواب Richardwb هي جيدة واحدة - ولكن النهج الآخر هو استخدام فتحة deleteLater، كما يلي:

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

من الواضح أن إغلاق () يمكن استبدال الإشارات مع أي إشارة تريد.

هذا البرنامج التعليمي يشير إلى أنك لا تحتاج إلى صراحة حذف الحاجيات التي تمت إضافتها إلى الوالدين الحاجيات.كما يقول فإنه لا يضر أن تفعل وحذفها سواء.

(لم تختبر هذا, ولكن أعتقد طالما كنت صراحة وحذفها قبل الوالدين القطعة حذف هذا ينبغي أن تكون على ما يرام.)

في معظم الحالات يجب إنشاء الحاجيات على المكدس:

    QPushButton push("neu");

وبهذه الطريقة، والحصول على حذف عندما تصبح خارج النطاق. إذا كنت تريد حقا أن خلق لهم على كومة، ثم انها مسؤوليتكم لاستدعاء حذف عليها عندما لا تكون هناك حاجة إليها بعد الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top