Виджет с атрибутом WA_TransparentForMouseEvents в QSplitter. Как это сделать?Python

Программы на Python
Anonymous
Виджет с атрибутом WA_TransparentForMouseEvents в QSplitter. Как это сделать?

Сообщение Anonymous »

У меня есть класс QMainWindow с QScrollArea с содержимым в качестве центрального виджета. И я создал main_layout с моей областью прокрутки в качестве родительского. Таким образом, у меня есть доступ к фоновому макету (self.scroll_area_layout), а также к прямому макету (self.main_layout).
Это работает хорошо, за исключением одного: когда я использую разделитель и хочу взаимодействовать со своей областью прокрутки через него. виджет с атрибутом WA_TransparentForMouseEvents в этом сплиттере, похоже, сплиттер обрабатывает эти события. Также я пытался обрабатывать события мыши из виджета и перенаправлять его в область прокрутки, но работает только WheelEvents (и мне нужно иметь возможность выбирать текст из меток в области прокрутки). Это мой класс виджета для обработки и перенаправления событий в область прокрутки:

Код: Выделить всё

class SignalTransmitterWidget(QWidget):
def __init__(self, scroll_area: QScrollArea, parent=None):
super().__init__(parent)
self.scroll_area = scroll_area
self.setStyleSheet('background: rgba(0,200,0,200)')

def event(self, event):
print(event)
QApplication.sendEvent(self.scroll_area.viewport(), event)
return True
У меня есть этот код (без SignalTransmitterWidget):

Код: Выделить всё

from PySide6.QtWidgets import QMainWindow, QApplication, QVBoxLayout, QWidget, QScrollArea, QLabel, QSplitter
from PySide6.QtCore import Qt

class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(500, 400)

self.scroll_area_layout = QVBoxLayout()
messages_widget = QWidget()
messages_widget.setLayout(self.scroll_area_layout)

self.messages_scroll = QScrollArea()
self.messages_scroll.setWidgetResizable(True)
self.messages_scroll.setWidget(messages_widget)
self.setCentralWidget(self.messages_scroll)

self.main_layout = QVBoxLayout(self.messages_scroll)
self.main_layout.setSpacing(0)

for i in range(20):
label = QLabel(f"Selectable Text {i+1}")
label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
self.scroll_area_layout.addWidget(label)
self.splitter = QSplitter(Qt.Orientation.Vertical)

widget1 = QLabel("widget1 no interaction")
widget1.setStyleSheet("background: rgba(0,0,0,100)")
widget1.setAlignment(Qt.AlignmentFlag.AlignCenter)

widget2 = QLabel("This widget2 must be transparent for mouse events as well as widget3")
widget2.setStyleSheet("background: rgba(0,0,0,100)")
widget2.setAlignment(Qt.AlignmentFlag.AlignCenter)
widget2.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents)

widget3 = QLabel("This widget3 is transparent for mouse events, but it must be in splitter")
widget3.setAlignment(Qt.AlignmentFlag.AlignCenter)
widget3.setFixedHeight(200)
widget3.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents)

self.splitter.addWidget(widget1)
self.splitter.addWidget(widget2)

self.main_layout.addWidget(self.splitter)
self.main_layout.addWidget(widget3)

if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
Результат:
Результат
И мне нужно взаимодействовать с областью прокрутки в виджете 2 так же, как вы можете взаимодействовать с виджетом 3. Буду признателен за вашу помощь.

Подробнее здесь: https://stackoverflow.com/questions/786 ... to-make-it

Вернуться в «Python»