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

发布于 2024-08-07 16:30:33 字数 351 浏览 9 评论 0原文

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

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

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

有想法吗?

My main application object is a QObject, that juggles a QSystemTrayIcon, a QDialog, a QWindow and a few other components. The app mostly sits in the tray, with some options dialogs etc etc.

Now, I'd like to use QMetaObject::connectSlotsByName() to connect signals from these objects to slots in the main object. It's 10-15 of them, so writing them by hand doesn't seem efficient, right, professional, modern, etc etc.

However, I can't use my QObject as parent to the QWidget based objects, nor can I change the object to inherit QWidget, as they will not show up, since the main object isn't visible.

Ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

暮年慕年 2024-08-14 16:30:33

您可以将 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();
}

You could promote the QObject to a hidden QWidget, see this answer. In a nutshell:

#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();
}
﹏半生如梦愿梦如真 2024-08-14 16:30:33

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

恐怕您无法使用 connectSlotsByName 来解决 QWidget 的父子问题,但如果您确实想要它,您可以在 中使用所有可用元数据QMetaObject,因此您可以在任何 QObject 对/集合上编写一个类似于 connectSlotsByName 的函数。

Connecting signals to slots manually is perfectly fine. Qt itself is doing that, most Qt applications are doing that.

I'm afraid you can't use connectSlotsByName for the parent-child issues with QWidget, but if you really want it, you have all the metadata available in QMetaObject, so you can write a function that works like connectSlotsByName on any pair/set of QObjects.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文