5

我的主要应用程序对象是 a QObject,它兼顾 a QSystemTrayIcon、 a QDialog、 aQWindow和其他一些组件。该应用程序主要位于托盘中,带有一些选项对话框等。

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

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

想法?

4

2 回答 2

3

您可以将其提升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();
}
于 2017-03-03T20:11:53.893 回答
2

手动将信号连接到插槽是非常好的。Qt 本身就是这样做的,大多数 Qt 应用程序都是这样做的。

恐怕你不能connectSlotsByName用于父子问题QWidget,但如果你真的想要它,你有所有可用的元数据QMetaObject,所以你可以编写一个函数,就像connectSlotsByName在任何对/组QObjects 上一样工作。

于 2009-10-18T21:23:33.913 回答