Это работает хорошо, за исключением одного: когда я использую разделитель и хочу взаимодействовать со своей областью прокрутки через него. виджет с атрибутом 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
Код: Выделить всё
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