هل من الممكن أن يكون لديك QWidget كطفل إلى Qobject؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

كائن التطبيق الرئيسي الخاص بي هو أ QObject, ، تلك المشوهة أ QSystemTrayIcon, ، أ QDialog, ، أ QWindow وبعض المكونات الأخرى. يجلس التطبيق في الغالب في الدرج ، مع بعض الحوارات خيارات وما إلى ذلك.

الآن ، أود استخدام QMetaObject::connectSlotsByName() لتوصيل الإشارات من هذه الكائنات إلى فتحات في الكائن الرئيسي. إنها من 10 إلى 15 منهم ، لذا فإن كتابتها باليد لا تبدو فعالة ، صحيحة ، مهنية ، حديثة ، إلخ ، إلخ.

ومع ذلك ، لا يمكنني استخدام بلدي QObject كوالد ل QWidget الكائنات القائمة ، ولا يمكنني تغيير الكائن إلى ورث QWidget, ، لأنهم لن يظهروا ، لأن الكائن الرئيسي غير مرئي.

أفكار؟

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

المحلول

إن توصيل الإشارات بالفتحات يدويًا بشكل جيد تمامًا. QT نفسه يفعل ذلك ، معظم تطبيقات QT تفعل ذلك.

أخشى أنك لا تستطيع استخدامها connectSlotsByName لقضايا الوالدين والطفل مع QWidget, ، ولكن إذا كنت تريد ذلك حقًا ، فلديك كل البيانات الوصفية متوفرة في QMetaObject, ، حتى تتمكن من كتابة وظيفة تعمل مثل connectSlotsByName على أي زوج/مجموعة من QObjectس.

نصائح أخرى

يمكنك الترويج QObject إلى مخفي QWidget, ، يرى هذا الجواب. شيء صغير:

#include <QtWidgets>

int main(int argc, char ** argv) {
   QApplication app{argc, argv};
   QWidget parent;
   QLabel l1{"Close me to quit!"}, l2{"Hello!"};
   for (auto label : {&l1, &l2}) {
      label->setMinimumSize(200, 100);
      label->setParent(&parent);
      label->setWindowFlags(Qt::Window);
      label->setText(QString("%1 Parent: %2.").
                     arg(label->text()).arg((quintptr)label->parent(), 0, 16));
      label->show();
   }
   l2.setAttribute(Qt::WA_QuitOnClose, false);
   return app.exec();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top