2009-10-18 3 views
1

Мой основной объект приложения - QObject, который жонглирует QSystemTrayIcon, a QDialog, a QWindow и несколькими другими компонентами. Приложение в основном находится в лотке, с некоторыми диалогами настроек и т. Д.Возможно ли иметь QWidget как ребенка для QObject?

Теперь я хотел бы использовать QMetaObject::connectSlotsByName() для подключения сигналов от этих объектов к слотам в основном объекте. Это 10-15 из них, поэтому писать их вручную не представляется эффективным, правильным, профессиональным, современным и т. Д.

Однако я не могу использовать мой QObject в качестве родителя для объектов на основе QWidget, а также не может Я изменяю объект наследовать QWidget, так как они не будут отображаться, так как основной объект не отображается.

Идеи?

+0

вопрос, связанный (не дубликат): http://stackoverflow.com/q/28992276/1329652 –

ответ

1

Подключение сигналов к разъемам вручную отлично. Сам Qt делает это, большинство приложений Qt делают это.

Я боюсь, что вы не можете использовать connectSlotsByName для родителей и детей проблем с QWidget, но если вы действительно хотите, у вас есть все метаданные, доступные в QMetaObject, так что вы можете написать функцию, которая работает как connectSlotsByName на любая пара/набор QObject s.

+0

Я тоже подключить несколько слотов, это просто потрудились сделать это с 10-20 из их. :) .. Написание моей собственной функции звучит как хороший план. Благодаря! – Macke

2

Вы можете разместить 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(); 
}