私はQAbstractScrollArea
の詳細を正しく取得するのに多くの問題を抱えています。これはviewportEvent
の私の現在の実装である:QAbstractScrollAreaでviewportEventをどのように実装する必要がありますか?
def viewportEvent(self, event):
if event.type() in [QEvent.MouseButtonPress,
QEvent.MouseMove,
QEvent.MouseButtonRelease,
QEvent.ContextMenu,
QEvent.KeyPress,
QEvent.KeyRelease]:
return self.my_viewport.event(event)
if event.type() == QEvent.Resize:
self.my_viewport.resizeEvent(event)
return super().viewportEvent(event)
if event.type() in [QEvent.UpdateLater,
QEvent.UpdateRequest]:
self.my_viewport.event(event)
if event.type() == QEvent.Paint:
self.my_viewport.paintEvent(event)
return super().viewportEvent(event)
アイデアは(ビューポートウィジェットに)キーとマウスを押すようなものを通過することです。サイズ変更イベントは、抽象スクロール領域自体を通過させて送信する必要がありますか?スクロールバーのサイズはどうですか?サイズ変更イベントのサイズを変更するべきではありません。ペイントイベントを通過させないと、ビューポートウィジェットはペイントしません。 QAbstractScrollAreaと壊れQOpenGLWidgetの
最小作業例:Qtのバグとして提出
import sys
from PyQt5.QtCore import QEvent
from PyQt5.QtWidgets import (QAbstractScrollArea, QApplication, QMainWindow,
QOpenGLWidget)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.scope_view_widget = ScrollingScopeView()
self.setCentralWidget(self.scope_view_widget)
class ScopeView(QOpenGLWidget):
def paintGL(self):
super().paintGL()
print("Painting")
class ScrollingScopeView(QAbstractScrollArea):
def __init__(self):
super().__init__()
self.set_my_viewport(ScopeView())
def set_my_viewport(self, new_viewport):
self.my_viewport = new_viewport
self.setViewport(self.my_viewport)
def viewportEvent(self, event):
# Uncommenting this breaks painting.
if event.type() == QEvent.Paint:
self.my_viewport.paintEvent(event)
return super().viewportEvent(event)
application = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(application.exec_())
は:https://bugreports.qt.io/browse/QTBUG-53269
Qtが 'QAbstractScrollArea'をどのように実装しているかを理解する必要があるようです。 'viewportEvent()'は、1)イベントをビューポートに伝播させたくない場合、2)ビューポートに到達する前にイベントを変更したい場合、3)イベントを捕捉したい場合のみ再実装する必要があります。あなたのスクロールエリアで何か他のことをしてください。 –
@JonHarperもしそれが本当であれば、なぜ私は明示的にペイントイベントを転送しない限り、中央のウィジェットはペイントしないのですか? –
@JonHarperそして、私はQtの仕組みを刷新するだけではありません。これをどうすればよいか分かっていれば、答えを自由に追加してください:) –