我的主要应用对象是QObject
,其中包含QSystemTrayIcon
,QDialog
,QWindow
和其他一些组件。该应用程序大多位于托盘中,有一些选项对话框等等。
现在,我想使用QMetaObject::connectSlotsByName()
将来自这些对象的信号连接到主对象中的插槽。它是10-15个,所以用手写它们似乎不高效,正确,专业,现代等等。
但是,我不能将QObject
作为基于QWidget
的对象的父级,也不能将对象更改为继承QWidget
,因为它们不会显示,因为主要对象不可见。
想法?
答案 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
类似的函数。