- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 qt 小部件覆盖 Maya 的事件 View 3d。
我有一个 Canvas 基类(一个透明的小部件),我可以在上面做一些绘画工作。它的父级是包装的 avtice 3d View 。一旦调整事件 3D View 的大小,就会发出 CanvasEventFilter.resize_event 信号以调整 Canvas 小部件的大小。
在 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 上它是偏移的
最佳答案
这似乎在 Centos 7 上非常适合我。当主窗口移动时,小部件会跟随,并在主窗口调整大小时正确调整大小。
我不得不重命名你的resize
方法,因为这意外地覆盖了小部件的 QtWidgets.QWidget.resize
方法(或者只需要使用 super
代替)。而不是setGeometry
我可以简单地使用 QtWidgets.QWidget.resize
。我还必须删除 Qt.SplashScreen
,否则它无法正确跟随或调整大小:
from PySide2.QtGui import QPainter, QPen, QPainterPath
from PySide2.QtCore import Qt, QObject, Signal, Slot, QEvent, QPointF, QPoint, QSize
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.WindowStaysOnTopHint | Qt.WindowTransparentForInput)
self.setStyleSheet("QWidget {background-color:black;}")
self.canvas_event_filter = CanvasEventFilter()
self.install_event_filter()
self.resize_event()
self.show()
def install_event_filter(self):
self.canvas_event_filter.resize_event.connect(self.resize_event)
view_wdg = 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_event(self):
view_wdg = active_view_wdg()
wdg_size = view_wdg.rect()
wdg_pos = view_wdg.pos()
abs_pos = view_wdg.mapToGlobal(wdg_pos)
self.resize(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
tool = Canvas(active_view_wdg())
tool.show()
关于python - qwidget.setGeometry() 在 Linux 上的位置不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51346212/
在将子 QWidget 添加到父 QWidget 后,我无法立即设置它的尺寸。问题是它根本没有设置几何图形: from PyQt4 import QtCore, QtGui class MyWid
我查看了以下链接,但找不到解决我的问题的方法: Qt setGeometry: Unable to set geometry Unable to set geometry in Qt https://
我的环境如下: Qt 5.4,使用 -platform win32-msvc2013 -opengl desktop -no-icu -skip webkit 从源代码构建 Visual Studio
我正在尝试使用 qt 小部件覆盖 Maya 的事件 View 3d。 我有一个 Canvas 基类(一个透明的小部件),我可以在上面做一些绘画工作。它的父级是包装的 avtice 3d View 。一
我正在使用 PyQt5 开发一个非常简单的应用程序,用于显示和排序图像。我是 Python 和 Qt 的新手,特别是我遇到了一些问题。我试图在 QLabel 对象中显示 QPixmap 图像,并且它们
我想在这里创建类似的自定义布局:http://doc.qt.io/qt-5/qtwidgets-layouts-flowlayout-flowlayout-cpp.html 我想要一些方法将复选框放在
为什么? setGeometry: Unable to set geometry 22x22+320+145 on QWidgetWindow/'WidgetClassWindow'. Resulti
所以我是 Famo.us 的新手,这可能是个愚蠢的问题(我希望不是)。 var Mesh = require('famous/webgl-renderables/Mesh'); ..... var m
我将一些代码从 Qt 5.6.0 迁移到了 5.12.0。令人惊讶的是,我收到了很多与 QWindowsWindow::setGeometry 相关的警告。每当一个对话框显示在另一个对话框之上时,我都
我是一名优秀的程序员,十分优秀!