Если виджет Qt (QWidget) размещен над другим виджетом, а атрибут Qt :: WA_NativeWindow установлен в одном или обоих, открытие и закрытие NSMenu приводит к получению неправильных событий QEvent :: MouseButtonPress и QEvent :: MouseButtonRelease первымwidget.
NSMenu должно быть открыто внутри обработчика события нажатия кнопки мыши виджета.
Вот пример кода для воспроизведения этого случая:
#include <QtWidgets/QtWidgets>
#import <Cocoa/Cocoa.h>
class WidgetWithAttribute : public QWidget
{
public:
WidgetWithAttribute(bool setAttr)
{
if(setAttr)
setAttribute(Qt::WA_NativeWindow);
}
protected:
virtual void mousePressEvent(QMouseEvent* event) override
{
if(event->button() == Qt::RightButton)
showMenu();
}
private:
void showMenu()
{
QMenu menu("Menu");
menu.addAction("Menu Item 1");
menu.addAction("Menu Item 2");
menu.addAction("Menu Item 3");
menu.addAction("Menu Item 4");
menu.addAction("Menu Item 5");
menu.addAction("Menu Item 6");
auto nsmenu = menu.toNSMenu();
auto pos = [NSEvent mouseLocation];
[nsmenu popUpMenuPositioningItem:nil atLocation:pos inView:nil];
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget widget;
auto layout = new QGridLayout;
layout->setContentsMargins(0, 0, 0, 0);
/// One or both of widgets should set attribute to produce the bug
layout->addWidget(new WidgetWithAttribute(true), 0, 0);
layout->addWidget(new WidgetWithAttribute(false), 0, 0);
widget.setLayout(layout);
widget.setMinimumSize(320, 180);
widget.show();
return a.exec();
}
Воспроизвести проблему:Щелкните правой кнопкой мыши внутри окна;Закрыть меню;Переместите курсор.
Результат: меню откроется снова, поскольку WidgetWithAttribute получил неправильное событие QEvent :: MouseButtonPress.
Может кто-нибудь объяснить, почему это происходит?