代码之家  ›  专栏  ›  技术社区  ›  Macke

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

  •  2
  • Macke  · 技术社区  · 16 年前

    我的主要应用程序对象是 QObject 那是一个戏法 QSystemTrayIcon A QDialog A QWindow 以及其他一些组件。该应用程序主要位于托盘中,带有一些选项对话框等。

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

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

    思想?

    2 回复  |  直到 9 年前
        1
  •  2
  •   LukáÅ¡ Lalinský    16 年前

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

    恐怕你不能用 connectSlotsByName 对于父子问题 QWidget ,但是如果您真的想要它,您可以在 QMetaObject ,这样您就可以编写一个函数 连接插槽byname 任何一对/一组 QObject S.

        2
  •  3
  •   Community Mohan Dere    9 年前

    你可以推广 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();
    }