Pyside2 - Как создать окно и сразу же убрать его фокус? - PullRequest
0 голосов
/ 08 января 2020

Я создаю аддон Blender, используя Pyside2. Я хочу, чтобы при наведении всплывающей подсказки отображалось окно Pyside2. У меня все установлено, но проблема в том, что он не работает, если перед окном блендера не было изменено другое окно. Вот рисунок, показывающий проблему. В этом случае, если окно VS Code не полноэкранное и перед Blender оно будет работать нормально.

enter image description here

В этом случае я использую регистр таймера для запуска каждые 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)
...