mayaでpyside(2 or 6)を使ってツール等々を作成してるのですがー
デュアルディスプレイ環境だと、予期せぬ位置にウィンドウが生成されてしまって
うーんってなることがあります。
従来の方法としては、QtWidgets.QMainWindowを作った後に、move()で移動させていました。
from PySide2 import QtWidgets,QtGui,QtCore
def getTopLevelWidget(name):
for widget in QtWidgets.QApplication.topLevelWidgets():
if widget.objectName() == name:
return widget
return None
class MainGUI(QtWidgets.QMainWindow):
def __init__(self,*args, **kwargs):
super(MainGUI,self).__init__(*args,**kwargs)
self.setWindowFlags(QtCore.Qt.Tool)
self.mainWidget = QtWidgets.QWidget(self)
mainLayout = QtWidgets.QHBoxLayout(self.mainWidget)
btn = QtWidgets.QPushButton("hogeeeeeeee")
mainLayout.addWidget(btn)
self.setCentralWidget(self.mainWidget)
def main():
mayaMainWindow = getTopLevelWidget('MayaWindow')
mainGUI = MainGUI(mayaMainWindow)
mainGUI.show()
mainGUI.move(100,100)
ただこのmove()で決める位置が、デュアルディスプレイだとプライマリのデスクトップの左上を0,0としたもので、
mayaのwindowがセカンダリのデスクトップにあったとしても、プライマリの座標(100,100) に作られてしまうので
一瞬 あれどこいった? ってなるんですね。
改修
mayaのwindowの中央にwindowを表示させるにはどうしたら・・・?
今回参考にさせて頂きました。
処理の順序としては
- mayaのwindowが表示されているデスクトップのindexを取得
- indexのデスクトップの左上のglobal座標?を取得
- mayaのwindowの現在のデスクトップにおける左上の座標を取得
- mayaのwindwo上の中心座標を取得
- 色々合算
という感じで。
from PySide2 import QtWidgets,QtGui,QtCore
def getTopLevelWidget(name):
for widget in QtWidgets.QApplication.topLevelWidgets():
if widget.objectName() == name:
return widget
return None
class MainGUI(QtWidgets.QMainWindow):
def __init__(self,*args, **kwargs):
super(MainGUI,self).__init__(*args,**kwargs)
self.setWindowFlags(QtCore.Qt.Tool)
self.mainWidget = QtWidgets.QWidget(self)
mainLayout = QtWidgets.QHBoxLayout(self.mainWidget)
btn = QtWidgets.QPushButton("hogeeeeeeee")
mainLayout.addWidget(btn)
self.setCentralWidget(self.mainWidget)
def main():
desktop = QtWidgets.QApplication.desktop()
mayaMainWindow = getTopLevelWidget('MayaWindow')
activeScreen = desktop.screenNumber(mayaMainWindow)
desktopRect = desktop.screenGeometry(activeScreen)
windowCenter = mayaMainWindow.rect().center()
windowCheck(objectName,mayaMainWindow)
mainGUI = MainGUI(mayaMainWindow)
mainGUI.resize(50,50)
mainGUI.show()
mainGUI.move(desktopRect.topLeft() + mayaMainWindow.rect().topLeft() + windowCenter)
中央に生成されました。
これでwindowを見失うことが減りそうです。