# ref: https://blenderartists.org/t/parent-pyqt-window-widget-to-blenders-window/700722/2 # install info # note: here we assume you already pip install PySide2 already, no check pyside2 code here bl_info={ "name":"MyToolUI Launcher Addon", "description": "MyToolUI Launcher", "author": "YourName", "version": (1, 0, 0), "blender": (2, 80, 0), "location": "3D View > Tools", "category":"Development" } import bpy from PySide2 import QtWidgets, QtCore # optional single instant of MyToolUI single_MyToolUI = None # QT UI PART class MyToolUI(QtWidgets.QWidget): def __init__(self, parent=None): super(MyToolUI, self).__init__(parent) main_layout = QtWidgets.QVBoxLayout() self.setLayout(main_layout) main_label = QtWidgets.QLabel("Example") main_input = QtWidgets.QLineEdit() main_button = QtWidgets.QPushButton("QButton to Toggle Always Top") main_layout.addWidget(main_label) main_layout.addWidget(main_input) main_layout.addWidget(main_button) main_button.clicked.connect(self.toggleAlwaysTopUI) def toggleAlwaysTopUI(self): self.setWindowFlags(self.windowFlags() ^ QtCore.Qt.WindowStaysOnTopHint) self.show() # Blender UI PART class MYTOOL_PT_MyTool_launcher_panel(bpy.types.Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'CoolTools' # the tab name bl_label = "MyTool Launcher" # tab tab > panel name def draw(self, context): layout = self.layout layout.operator('custom.mytool_show_op') # Blender Operator Button to launch QT UI class MYTOOL_OT_show_op(bpy.types.Operator): bl_idname = 'custom.mytool_show_op' bl_label = "Launch MyTool" bl_options = {'REGISTER'} def execute(self, context): self.app = QtWidgets.QApplication.instance() if not self.app: self.app = QtWidgets.QApplication(['blender']) self.event_loop = QtCore.QEventLoop() # single UI global single_MyToolUI if single_MyToolUI is None: single_MyToolUI = MyToolUI() self.widget = single_MyToolUI self.widget.show() return {'FINISHED'} CLASSES = [ MYTOOL_PT_MyTool_launcher_panel, MYTOOL_OT_show_op ] def register(): for cls in CLASSES: bpy.utils.register_class(cls) def unregister(): for cls in CLASSES: bpy.utils.unregister_class(cls) if __name__ == "__main__": register()