Qt, множественное наследование, оболочки или фильтры событий

У меня есть несколько разных виджетов отображения на основе QGlWidget, которые мне нужно встроить в приложение на основе MDI или QDockwidget. Но мне нужно обработать некоторые специфические события MDI/Dock (свернуть/закрепить и т. д.) в моем виджете отображения.

Варианты:
Multiply наследовать виджеты отображения от QGlWidget и QMdiSubWindow/QDockWidget. Есть ли проблемы с множественным наследованием и сигналами/слотами?

Инкапсулируйте дисплей внутри виджета, производного от QMdiSubWindow/QDock, но затем мне нужно обернуть все внешние функции дисплея в виджет-оболочку Mdi/Dock.

Когда я создаю новое окно, создаю временный виджет Mdi/Dock, подключаю все специальные сигналы к слотам на дисплее, прежде чем прикреплять к нему дисплей и показывать его. Но это не работает для событий.

Некоторая магия QSignalMapper, где я могу получать определенные сигналы QMdiSubWindow/QDockWidget в QGlWidget


person Martin Beckett    schedule 16.04.2012    source источник
comment
Qt не поддерживает двойное наследование от QObject в одном и том же объекте, поэтому, предполагая, что QGIWidget является подклассом QWidget, ваш первый вариант не будет работать...   -  person Jeremy Friesner    schedule 17.04.2012
comment
@JeremyFriesner - спасибо, я думал, что это не сработало   -  person Martin Beckett    schedule 17.04.2012


Ответы (1)


Виджеты MDI/dock являются контейнерами для других виджетов, поэтому смешивание их функций с виджетами отображения не очень хорошее решение, поскольку в итоге вы получите отвратительный гибридный виджет, который выглядит как контейнер, но не может ничего содержать. Не то чтобы Qt позволил это, как заметил Джереми.

Если вашему QGLWidget нужны события из его родительского контейнера (например, свернуть, закрепить и т. д.), почему вы не можете создать для них партнерские методы в QGLWidget и вызывать их всякий раз, когда действие выполняется родителем?

person cmannett85    schedule 17.04.2012
comment
Это было в значительной степени то, что я думал, что мне придется сделать - я надеялся избежать необходимости обертывать каждую функцию displayWidget в виджет контейнера, чтобы меню/панель инструментов mainWindow и т. д. могли вызывать их. И поскольку контейнер может содержать различные типы дисплеев, он также должен проверять, что он содержит. - person Martin Beckett; 17.04.2012
comment
Интересно, что док-виджет разработан по-другому, он может быть унаследован от любого QWidget и больше похож на класс интерфейсного типа, чем на чистый контейнер. - person Martin Beckett; 17.04.2012