Обратите внимание , что это не полный ответ (я не стремлюсь к этой награде), а скорее какой-то твердый фон в QMenu и как он обрабатывает виджеты.
У вас есть две проблемы:
1) Реализация по умолчанию QWidgetAction::create()
ничего не делает. Вы намерены переопределить это в своей реализации, поэтому было бы удивительно, если бы ваш оригинальный код сработал .
2) После того, как вы отвергли QWidgetAction
, вы столкнулись с большой проблемой: QMenu
не содержит QWidgets
с QLayout
. Это контейнер указателей на QAction
с и вектор их вычисленных QRect
с. Он поддерживает состояние, но это , а не традиционный контейнер виджетов Qt.
"Но подожди!" Вы говорите, что насчет QMenuPrivate::widgetItems
? Хороший вопрос. QMenu
отслеживает добавленные в него виджеты, но они не сильно интегрированы. Все, что действительно делает QMenu
, - это резервирует sizeHint виджета и следит за тем, чтобы он не рисовал там, где виджет , вероятно, расположен в соответствии с его sizeHint.
"Я уже пробовал это. Это не решает проблему. Как правило, события перемещения мыши, ввода и выхода принимаются, если не отображается подменю. К вашему сведению: однажды я включал mouseTracking на каждом виджет в MWE, без разницы. "
Я упоминал выше, что QMenu
не интегрируется с виджетами, добавленными в него? Это то, где это начинает действительно говорить. Подменю представляют собой спагетти-код для конкретной платформы и тесно связаны с соответствующим кодом QPA QMenu
. Такие вещи, как внутренние поля, смещение для рисования меню (на некоторых платформах подменю смещается на несколько пикселей), в котором в данный момент находится подменю, все они , а не , распространяются на QWidget
, добавленные к меню. Бросьте в подменю, которое захватывает ваш фокус ( и создает свой собственный цикл событий!), И внезапно вы попадаете в неизведанные воды.
Если вы хотите добавить кнопку в одноуровневое меню, QWidgetAction
сделает это. Действия, которые действуют как действия и отображают подменю? Вы входите на территорию "include qmenu_p.h".
"Чем больше я думаю о вашем решении, тем больше я чувствую, что это уже правильное решение. Что должно быть неправильно, чтобы QMenu отвечал за выделение своих действий? Я думаю, что мое желание сделать каждый виджет действия ответственным за свое выделение что неуместно ... "
Правильно. QMenu не уделяет особого внимания вашему виджету. Он просто создает пространство для него и общается в основном через связанные QAction
.