Qt / PySide: связывание состояния наведения-подсветки двух виджетов - PullRequest
1 голос
/ 21 февраля 2020

Мне нужна функция, которая берет два виджета Qt и «связывает» их так, что независимо от того, над какой мышью они наведены, они оба выделяются с помощью (стандартной) подсветки при наведении (если они есть).

Это должно работать с любыми видами виджетов, которые вызывающая сторона передает этой функции; эта функция не может требовать, чтобы вызывающие абоненты создавали подклассы виджетов только для того, чтобы сделать эту работу.

Вот несколько изображений того, о чем я говорю:

enter image description here

Обычно, когда вы наводите курсор на виджет, он подсвечивается, как показано на рисунках 1 и 2. Мне нужен пример того, как все настроить, чтобы независимо от того, над каким виджетом зависла мышь, они ОБА подсвечиваются с помощью своей стандартной подсветки при наведении, как показано на рисунке 3. В идеале эта функция должна работать в общем случае, работая только со своими аргументами как QWidgets, независимо от того, какие они виджеты на самом деле (потому что подсветка при наведении является обобщенной c Qt поведение, в конце концов).

def link_highlighting(widgetA, widgetB):

   ... what should go here? ...

Такое чувство, что это будет связано с довольно темным хакерством событий, но мой фу хакинг событий не силен.

Идеи? Предложения

1 Ответ

0 голосов
/ 20 марта 2020

Я провел небольшое исследование и вижу два способа, которыми это можно сделать прямо сейчас: c.

Первая часть - обнаружение действия при наведении. Это должно быть легко. Просто подпишитесь на enterEvent и leaveEnvent обоих виджетов. Пока они имеют тип QWidget, это будет работать. При этом вы будете уведомлены, когда мышь войдет или покинет виджет.

Затем выделение части. Здесь у вас есть два варианта:

  1. Вы можете подделать событие мыши на втором виджете, в основном эмулируя вторую мышь enterEvent. Это можно сделать с помощью qApp.sendEvent(widget, event).

  2. Вы можете изменить палитру второго виджета. В основном, чтобы установить нормальную палитру на выделенную палитру. Здесь вы должны использовать такие функции, как:

    palette = widget.getPalette()
    palette.setColor(QPalette.Base, widget.palette().color(QPalette.Highlight))
    widget.setPalette(palette)
    

    Это, очевидно, требует некоторых экспериментов. И на данный момент это работает только для стилей виджетов, которые работают с палитрами. Для тех, кто работает с CSS, нужно сделать то же самое. Найдите бит, который применяется для выделения, и скопируйте его в нормальное состояние.

    В зависимости от того, насколько общий ваш случай, это может быть очень просто или очень сложно.

Дайте мне знать, как это происходит.

...