هل من الممكن أن يكون لديك QWidget كطفل إلى Qobject؟
-
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();
}