是否可以将QWidget作为QObject的子项?

时间:2009-10-18 20:50:50

标签: qt signals-slots qwidget

我的主要应用对象是QObject,其中包含QSystemTrayIconQDialogQWindow和其他一些组件。该应用程序大多位于托盘中,有一些选项对话框等等。

现在,我想使用QMetaObject::connectSlotsByName()将来自这些对象的信号连接到主对象中的插槽。它是10-15个,所以用手写它们似乎不高效,正确,专业,现代等等。

但是,我不能将QObject作为基于QWidget的对象的父级,也不能将对象更改为继承QWidget,因为它们不会显示,因为主要对象不可见。

想法?

2 个答案:

答案 0 :(得分:3)

您可以将QObject宣传为隐藏QWidget,请参阅this answer。简而言之:

#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();
}

答案 1 :(得分:2)

手动将信号连接到插槽完全没问题。 Qt本身正在这样做,大多数Qt应用程序正在这样做。

我担心您无法将connectSlotsByName用于QWidget的父子问题,但如果您真的需要,则QMetaObject中有所有元数据,所以你可以在connectSlotsByName的任何一对/一组上编写一个与QObject类似的函数。