【问题标题】:Is it possible to have a QWidget as a child to a QObject?是否可以将 QWidget 作为 QObject 的子对象?
【发布时间】:2009-10-18 20:50:50
【问题描述】:

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

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

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

想法?

【问题讨论】:

标签: qt signals-slots qwidget


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我也连接了一些插槽,只连接 10-20 个插槽很麻烦。 :) .. 编写我自己的函数听起来是个不错的计划。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多