Я создаю аддон Blender, используя Pyside2. Я хочу, чтобы при наведении всплывающей подсказки отображалось окно Pyside2. У меня все установлено, но проблема в том, что он не работает, если перед окном блендера не было изменено другое окно. Вот рисунок, показывающий проблему. В этом случае, если окно VS Code не полноэкранное и перед Blender оно будет работать нормально.
В этом случае я использую регистр таймера для запуска каждые 0,1 секунды, который будет проверять, находится ли мышь над кнопкой. Если это так, то покажите виджет Pyside2, если нет, то спрячьте его.
Я думаю, что происходит, что как только виджет создается, мышь больше не над кнопкой, а над виджетом, а затем скрывает его. сразу после. Я думаю, что решением было бы убрать фокус окна pyside и продолжить в окне блендера, но я не знаю, как это сделать. Я пробовал методы clearFocus и unsetCursor, но не работал.
И я не знаю, действительно ли это вызвало эту проблему. Если вы думаете, что это может быть другая проблема, пожалуйста, прокомментируйте ниже. Вот мой код:
#function to be registered in timer
def animation():
animation.block = getattr(animation, "block", False)
if not animation.block:
print("playing")
return 0.1
else:
print("not playing")
return 0.1
animation.block = True
...
#addon modal method
def modal(self,context,event):
#wm = context.window_manager
global tooltip_active
global active_tooltip_brush
wm = context.window_manager
#widget position relative to mouse pointer position
self.qpoint = QtCore.QPoint(event.mouse_x+10, (-event.mouse_y)+730)
self.widget.move(self.qpoint)
#show widget. the step is used to not recreate another widget in every loop step
if animation.block == False:
if tooltip_active["step"] == 1:
pass
else:
tooltip_active["step"] = 1
self.show_widget(tooltip_active["brush"], self.qpoint)
self.widget.clearFocus()
self.widget.unsetCursor()
else:
tooltip_active["step"] = 0
self.widget.label.hide()
self.event_loop.processEvents()
self.app.sendPostedEvents(None,0)
return {'PASS_THROUGH'}
#this callable is activated everytime the mouse hovers a button
def tooltip(context, tool, keymap):
bpy.app.timers.register(animation)
animation.block = False
print(tool.label)
AnimatedPreview.set_active_brush(tool.label)
AnimatedPreview.set_active_tooltip(True, tool.label)
return ""
if __name__ == "preview_animated":
register()
bpy.app.timers.register(animation)
Виджет создан в другом классе:
class Ui_Form(QtWidgets.QDialog):
label = None
size = QtCore.QSize(160, 100)
def __init__(self, parent=None):
super(Ui_Form, self).__init__(parent)
self.setAnimatedGif('Clay.gif', QtCore.QPoint(0, 0))
self.setAnimatedGifLayout()
def setAnimatedGif(self, gif_path, _qpoint):
self.pixel = QtGui.QMovie(
'/home/mateus/Documents/Blender Projects/preview_animated/gifs/'+gif_path)
self.pixel.setScaledSize(self.size)
self.setFixedSize(160, 100)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
self.label = QtWidgets.QLabel()
self.label.setStyleSheet("""
QWidget{
background: transparent;
}
QFrame{
border-style: solid;
border-color: #FE9618;
border-width: 2px;
border-radius: 3px;
background-color: rgba(55, 55, 55, 255);
}
""")
self.label.setMovie(self.pixel)
self.pixel.start()
self.label.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.label.show()
self.label.unsetCursor()
self.label.move(_qpoint)