На macOS после открытия и закрытия NSMenu QWidget получает неправильные события мыши - PullRequest
0 голосов
/ 20 декабря 2018

Если виджет 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.

Может кто-нибудь объяснить, почему это происходит?

...