كيفية مسح جميع عناصر واجهة المستخدم في الأصل؟

StackOverflow https://stackoverflow.com/questions/3940409

  •  30-09-2019
  •  | 
  •  

سؤال

أنا أستخدم المنشئ QWidget(QWidget *parent). تحتوي هذه القطعة الوالدية على الكثير من عناصر واجهة المستخدم. أحتاج إلى مسح جميع عناصر واجهة المستخدم من الوالد في وقت التشغيل. كيف يمكنني أن أفعل هذا؟

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

المحلول

يمكنك استخدام ما يلي في فئة عنصر واجهة المستخدم الخاصة بك:

QList<QWidget *> widgets = findChildren<QWidget *>();
foreach(QWidget * widget, widgets)
{
    delete widget;
}

نصائح أخرى

الإجابة السابقة خاطئة !! لا يمكنك استخدام findChildren لحذف أطفال القطعة ، لأن QT4's findChildren متكرر يسرد الأطفال. لذلك ، ستحذف أطفال الأطفال ، والتي قد يتم حذفها مرتين بعد ذلك ، مما قد يحطم تطبيقك.

بشكل عام ، في QT ، أخذ قائمة من QObject مؤشرات وحذفها واحدًا تلو الآخر أمر خطير ، لأن تدمير كائن قد يقوم بسلسلة الأشياء الأخرى ، بسبب آلية ملكية الوالدين ، أو عن طريق توصيل أ destroyed() إشارة إلى deleteLater() فتحة. لذلك ، قد يؤدي تدمير الكائنات الأولى في القائمة إلى إبطال الكائنات التالية.

تحتاج إلى إدراج عناصر واجهة المستخدم إما عن طريق:

  • تمرير علم QT :: FindDirectchildrenonly إلى FindChild إذا كنت تستخدم QT5 (الذي لم يكن موجودًا عند طرح السؤال ...)
  • باستخدام وظائف QLayout لإدراج عناصر ،
  • باستخدام Qobject :: الأطفال ، ولكل اختبار إذا كان عنصر واجهة مستخدم باستخدام isWidgetType () أو طاقم عمل
  • باستخدام FindChild () في حلقة وحذف النتيجة حتى تُرجع مؤشرًا فارغًا

لرعاية مشكلة التكرار التي أشار إليها Galinette ، يمكنك فقط إزالة الحاجيات في حلقة من حين لآخر

while ( QWidget* w = findChild<QWidget*>() )
    delete w;

تلخيص ومكمل:

ل QT5 في سطر واحد:

qDeleteAll(parentWidget->findChildren<QWidget*>("", Qt::FindDirectChildrenOnly));

لـ QT5 لكثير من الأطفال ، باستخدام SetupDatesEnabled ():

parentWidget->setUpdatesEnabled(false);
qDeleteAll(parentWidget->findChildren<QWidget*>("", Qt::FindDirectChildrenOnly));
parentWidget->setUpdatesEnabled(true);

لاحظ أن هذا ليس استثناءً آمنًا! على الرغم من أن QT لا يبدو أنه في هذا الوقت يرمي استثناءات هنا ، يمكن توصيل الإشارة المدمرة () بالرمز الذي يرمي ، أو كائنًا متوجهاً:

من الأفضل استخدام فئة المساعد:

class UpdatesEnabledHelper
{
    QWidget* m_parentWidget;
public:
    UpdatesEnabledHelper(QWidget* parentWidget) : m_parentWidget(parentWidget) { parentWidget->setUpdatesEnabled(false); }
    ~UpdatesEnabledHelper() { m_parentWidget->setUpdatesEnabled(true); }
};

...

UpdatesEnabledHelper helper(parentWidget);
qDeleteAll(parentWidget->findChildren<QWidget*>("", Qt::FindDirectChildrenOnly));

ل QT4:

QList<QWidget*> childWidgets = parentWidget->findChildren<QWidget*>();
foreach(QWidget* widget, childWidgets)
    if (widget->parentWidget() == parentWidget)
        delete widget;

الإزالة من أعمال QLayout في كل من QT4 و QT5:

QLayoutItem* child;
while (NULL != (child = layout->takeAt(0))) // or nullptr instead of NULL
    delete child;

Qobjects (وبالتالي QWidgets) تزيل نفسها (تلقائيًا) من والديهم في المدمرة (Qobject).

من QT مستندات

يُظهر جزء الكود التالي طريقة آمنة لإزالة جميع العناصر من التصميم:

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
    ...
    delete child;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top