【发布时间】:2018-07-15 07:25:27
【问题描述】:
我正在尝试使用 qt 小部件覆盖 maya 的活动视图 3d。
我有一个画布基类(一个透明小部件),我可以在上面做一些绘画。它的父级是包装的 avtice 3d 视图。 一旦活动 3d 视图调整大小,就会发出 CanvasEventFilter.resize_event 信号以调整画布小部件的大小。
在 mac 和 windows 上一切正常。 但是在 linux 上,小部件是偏移的。我从 mapToGlobal() 得到的值似乎是正确的。 但是 setGeometry() 不会像我期望的那样更新小部件的位置和大小。
我在这里错过了什么?
from PySide2.QtGui import QPainter, QPen, QPainterPath
from PySide2.QtCore import Qt, QObject, Signal, Slot, QEvent, QPointF, QPoint
from PySide2.QtWidgets import QWidget, QLabel, QGridLayout
import maya.OpenMayaUI as omui
import shiboken2
class CanvasEventFilter(QObject):
resize_event = Signal(QEvent)
def __init__(self):
super(CanvasEventFilter, self).__init__()
def eventFilter(self, obj, event):
if event.type() == QEvent.Resize:
self.resize_event.emit(event)
return False
class Canvas(QWidget):
def __init__(self, parent):
super(Canvas, self).__init__(parent=parent)
self.setWindowFlags(Qt.FramelessWindowHint | Qt.SplashScreen | Qt.WindowStaysOnTopHint | Qt.WindowTransparentForInput)
# self.setAttribute(Qt.WA_TranslucentBackground)
# self.setAttribute(Qt.WA_NoSystemBackground)
# self.setAttribute(Qt.WA_PaintOnScreen)
# self.setAttribute(Qt.WA_TransparentForMouseEvents)
self.canvas_event_filter = CanvasEventFilter()
self.install_event_filter()
self.resize()
self.show()
def install_event_filter(self):
self.canvas_event_filter.resize_event.connect(self.resize)
view_wdg = window_utils.active_view_wdg()
view_wdg.installEventFilter(self.canvas_event_filter)
def remove_event_filter(self):
view_wdg = active_view_wdg()
view_wdg.removeEventFilter(self.canvas_event_filter)
@Slot(QEvent)
def resize(self):
view_wdg = active_view_wdg()
wdg_size = view_wdg.rect()
wdg_pos = view_wdg.pos()
abs_pos = view_wdg.mapToGlobal(wdg_pos)
self.setGeometry(abs_pos.x(), abs_pos.y(), wdg_size.width(), wdg_size.height())
def __del__(self):
self.remove_event_filter()
def active_view_wdg():
view = omui.M3dView.active3dView()
active_view_widget = shiboken2.wrapInstance(long(view.widget()), QWidget)
return active_view_widget
mac 上的黑色小部件正是它预期的位置。在 linux 上是偏移量
【问题讨论】: