Qt заставляет Qt :: Leave Event срабатывать, когда x количество пикселей от виджета - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь создать собственную оконную систему, которая реагирует только на относительное расположение виджета для каждого действия, включая перетаскивание виджета и изменение его размера.Однако у меня возникает эта проблема с мигающим курсором, потому что я установил курсор мыши в зависимости от его положения относительно виджета для всех 8 направлений комбинации курсоров.Когда я подхожу к любому краю границы родительского виджета, он пытается восстановить свой курсор по умолчанию и правильный курс для того края, на котором мы находимся, следовательно, мигает.

У меня установлен фильтр событий на родительском виджете, который должен при перемещении мыши проверять, нужно ли нам обновлять курсор в зависимости от его положения относительно виджета.В дополнение к этому у меня есть другая функция для выхода из виджета, которая определяет, когда сбросить курсор к его значению по умолчанию.Однако я использую borderWidth в пикселях для определения типа курсора ... Технически я использую безрамное окно, но закрашиваю рамку вокруг его границы, которая занимает borderWidth пикселей.Есть ли способ вызвать событие выхода вместо этого, когда borderWidth пикселей от этого виджета, даже если эти пиксели на самом деле не являются частью виджета?Я также не хочу, чтобы какой-либо родительский контейнер, который может содержать этот оконный виджет, обрабатывал это событие, как, например, событие перемещения QGraphicsScene.Я знаю, что когда я делаю событие щелчка и перетаскивания из виджета, я могу напечатать позиции, которые являются отрицательными относительно виджета, есть ли способ для меня вызвать событие перемещения / выхода подобным образом?

Я нашел предыдущую статью, в которой кто-то создал невидимый родительский виджет, который содержал один макет, а затем внедрил нужный виджет в макет невидимого родителя с полем содержимого.

Как освободить свободное место вокруг бескаркасного QWidget?

В этом сообщении выше подробно.Я надеялся, что был какой-то другой очевидный метод, который мне не хватало, потому что мне придется переделывать большую часть своего кода, чтобы работать с этим.

tl; dr: я хочу вызвать QWidget :: leftEvent, находясь на расстоянии borderWidth пикселей от виджета, а не на точной границе виджета.

Вот коддля справки:

bool TitleBar::eventFilter(QObject *o, QEvent*e) {
    if (e->type() == QEvent::MouseMove ||
        e->type() == QEvent::HoverMove ||
        e->type() == QEvent::Leave ||
        e->type() == QEvent::MouseButtonPress ||
        e->type() == QEvent::MouseButtonRelease) {

        QRect origGeom;
        QRect marginGeom;

        switch (e->type()) {
            case QEvent::MouseMove:
                mouseMove(static_cast<QMouseEvent*>(e));
                return true;
                break;
            case QEvent::HoverMove:
                mouseHover(static_cast<QHoverEvent*>(e));
                return true;
                break;
            case QEvent::Leave: //We're actually leaving the widget after we go out of the geometry + borderWidth
                mouseLeave(static_cast<QHoverEvent*>(e));
                return true;
                break;
            case QEvent::MouseButtonPress:
                mousePress(static_cast<QMouseEvent*>(e));
                return true;
                break;
            case QEvent::MouseButtonRelease:
                mouseRelease(static_cast<QMouseEvent*>(e));
                return true;
                break;
            default:
                //e->accept();
                return true;
                break;
        }
    } else {
        return _parent->eventFilter(o, e);
    }
}

void TitleBar::mouseHover(QHoverEvent *e) {
    updateCursorShape(_parent->mapToParent(e->pos()));
}

void TitleBar::mouseLeave(QHoverEvent *e) {
    if (!_leftButtonPressed) {
        QApplication::restoreOverrideCursor();
        _cursorchanged = false;
        _prevCursorShape = Qt::ArrowCursor;
    }
}
...