如何使对话框窗口仅停留在 Maya/Motionbuilder 父程序之上? [英] How to make a Dialog window stay on top of only Maya/Motionbuilder parent program?

查看:78
本文介绍了如何使对话框窗口仅停留在 Maya/Motionbuilder 父程序之上?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 Python 编辑器控制台中运行此代码后,我试图在父 Maya 或 Motionbuilder 程序顶部保留一个对话框窗口,但我似乎无法理解.现在,窗口将停留在一切之上,这不是我想要的.我只想要它在父 3D 程序窗口的顶部.

I am trying to keep a dialog window on top of the parent Maya or Motionbuilder program after running this code in its Python Editor console, but I can't seem to understand. Right now, the window will stay on top of EVERYTHING, which is not what I want. I just want it on top of the parent 3D program window.

代码如下:

from PySide import QtCore, QtGui

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))

class Dialog(QtGui.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)

if __name__ in ('__main__', '__builtin__'):
    app = QtGui.QApplication.instance()
    print(app.topLevelWidgets())
    if app is None:
        app = QtGui.QApplication([])
    w  = Dialog(app.topLevelWidgets()[0])
    w.show()
    app.exec_()

打印输出(app.topLevelWidgets()):

Outuput of print(app.topLevelWidgets()):

[<PySide.QtGui.QMenu object at 0x0000000032F97348>, <PySide.QtGui.QWidget object at 0x0000000032F97388>, <PySide.QtGui.QWidget object at 0x0000000032F973C8>, <PySide.QtGui.QMenu object at 0x0000000032F97408>, <PySide.QtGui.QWidget object at 0x0000000032F97448>, <PySide.QtGui.QMenu object at 0x0000000032F97488>, <PySide.QtGui.QWidget object at 0x0000000032F974C8>, <PySide.QtGui.QWidget object at 0x0000000032F97508>, <PySide.QtGui.QWidget object at 0x0000000032F97548>, <PySide.QtGui.QMenu object at 0x0000000032F97588>, <PySide.QtGui.QWidget object at 0x0000000032F975C8>, <PySide.QtGui.QMenu object at 0x0000000032F97608>, <PySide.QtGui.QWidget object at 0x0000000032F97648>, <PySide.QtGui.QWidget object at 0x0000000032F97688>, <PySide.QtGui.QWidget object at 0x0000000032F976C8>, <PySide.QtGui.QWidget object at 0x0000000032F97708>, <PySide.QtGui.QWidget object at 0x0000000032F97748>, <PySide.QtGui.QMenu object at 0x0000000032F97788>, <PySide.QtGui.QMenu object at 0x0000000032F977C8>, <PySide.QtGui.QWidget object at 0x0000000032F97808>, <PySide.QtGui.QWidget object at 0x0000000032F97848>, <PySide.QtGui.QWidget object at 0x0000000032F97888>, <PySide.QtGui.QMainWindow object at 0x0000000032F92EC8>, <PySide.QtGui.QWidget object at 0x0000000032F978C8>, <PySide.QtGui.QMenu object at 0x0000000032F97908>, <PySide.QtGui.QMenu object at 0x0000000032F97948>, <PySide.QtGui.QMenu object at 0x0000000032F97988>, <PySide.QtGui.QMenu object at 0x0000000032F979C8>, <PySide.QtGui.QWidget object at 0x0000000032F97A08>, <PySide.QtGui.QMenu object at 0x0000000032F97A48>, <PySide.QtGui.QMenu object at 0x0000000032F97A88>, <PySide.QtGui.QMenu object at 0x0000000032F97AC8>, <PySide.QtGui.QWidget object at 0x0000000032F97B08>, <Dialog object at 0x0000000032F92F88>, <PySide.QtGui.QWidget object at 0x0000000032F97B48>, <PySide.QtGui.QMenu object at 0x0000000032F97B88>, <PySide.QtGui.QMenu object at 0x0000000032F97BC8>, <PySide.QtGui.QMenu object at 0x0000000032F97C08>, <PySide.QtGui.QWidget object at 0x0000000032F97C48>, <PySide.QtGui.QWidget object at 0x0000000032F97C88>, <PySide.QtGui.QMenu object at 0x0000000032F97CC8>]

推荐答案

import maya.OpenMayaUI as OMUI
import shiboken2

import PySide2.QtCore as QtCore
import PySide2.QtWidgets as QtWidgets

class YourWindowClass(QtWidgets.QWidget):
    def init(self):
        super(YourWindowClass, self).init()

        # get Maya's main window
        self.mayaWin = OMUI.MQtUtil.mainWindow() 
        self.mayaWin = shiboken2.wrapInstance(long(self.mainWin), QtWidgets.QWidget)

        # parent your window to Maya's main window
        self.setParent(self.mayaWin, QtCore.Qt.WindowStaysOnTopHint)

这应该仅将 WindowStaysOnTopHint 标志应用于您的窗口的父窗口(这里是 Maya 的主窗口),但严格来说:大纲面板和其他面板将位于您的窗口顶部,因为它们位于 Maya 窗口的顶部.

This should apply WindowStaysOnTopHint flag only to your window's parent (here Maya's main window), but in a strict way: outliner panels and others will be on top of your window since they stay on top of Maya's window.

这篇关于如何使对话框窗口仅停留在 Maya/Motionbuilder 父程序之上?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆