2016-10-16 6 views
3

私はPyQt4プログラムをPyQt5に移植しています。その1つの部分はウィンドウを隠し、ウィンドウの背後にある領域のスクリーンショットを撮り、再びウィンドウを表示します。これはPyQt4でうまくいきました。PyQt5ポート:ウィンドウを隠して同じ位置に表示させる方法

私のPyQt5ポートではすべて正常に動作しますが、ウィンドウはプログラムの起動時の位置に表示され、hide()メソッドを呼び出す前の位置には表示されません。

これはLinuxのボックスでテストしています。まで、関連するコードストリップ:SHOWMEで

import sys 
from PyQt5.QtCore import QTimer 
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, 
          QGridLayout, QPushButton) 

class demo(QMainWindow): 

    def __init__(self): 
     super().__init__() 

     mainWidget = QWidget(self) 
     layout = QGridLayout(mainWidget) 
     self.setCentralWidget(mainWidget) 

     self.testButton = QPushButton(self) 
     self.testButton.setText('Test') 
     self.testButton.clicked.connect(self.hideMe) 
     layout.addWidget(self.testButton, 0, 0) 

    def hideMe(self): 
     self.hide() 
     QTimer.singleShot(300, self.showMe) 

    def showMe(self): 
     self.show() 
     self.move(self.pos()) 

app = QApplication(sys.argv) 
mainWindow = demo() 
mainWindow.show() 
sys.exit(app.exec_()) 

()、self.pos()は実際に右の座標が含まれていますが、ウィンドウはそこに移動されていません(それは直後に持っていたことだ「オリジナル」の位置に起動)。

e。 g。代わりにself.move(10、10)を実行すると、ウィンドウは実際にそこに移動します。しかし、私が変数を使うと(変数にself.posのxとyを保存し、代わりにこの変数を使用しようとすると)、ウィンドウは起動後の位置に表示されます。

整数を使用したmove()呼び出しは実際にウィンドウを移動させますが、変数を使用したmove()呼び出しはなぜですか?ウィンドウを隠す前の位置に移動するにはどうすればよいですか?

ありがとうございました!

編集(多分違いますかを見つけるために):

PyQt4を使用して非常に同じコードが動作します。

import sys 

from PyQt4.QtCore import QTimer 
from PyQt4.QtGui import (QApplication, QMainWindow, QWidget, 
         QGridLayout, QPushButton) 

class demo(QMainWindow): 

    def __init__(self): 
     super().__init__() 

     mainWidget = QWidget(self) 
     layout = QGridLayout(mainWidget) 
     self.setCentralWidget(mainWidget) 

     self.testButton = QPushButton(self) 
     self.testButton.setText('Test') 
     self.testButton.clicked.connect(self.hideMe) 
     layout.addWidget(self.testButton, 0, 0) 

    def hideMe(self): 
     self.hide() 
     QTimer.singleShot(300, self.showMe) 

    def showMe(self): 
     self.show() 
     self.move(self.pos()) 

app = QApplication(sys.argv) 
mainWindow = demo() 
mainWindow.show() 
sys.exit(app.exec_()) 

なぜQt5が、この場合にはQt4に異なる振る舞い?

+0

'hideMe'と' showMe'に 'self.pos()'を表示し、違いを見てください。 – furas

+0

それはポイントです:違いはありません! –

+0

@TobiasLeupold。どのLinuxディストリビューションを使用しているのか、またどのウィンドウマネージャーを使用しているのかを記述すると役に立ちます。 – ekhumoro

答えて

2

Qt5で、それはまったく同じである場合、ジオメトリが再設定されないようです。また影響を受けるのはポジションだけではなく、サイズ変更も無視されることに注意してください。ここで

は、問題を回避するためのハックです:

from PyQt5.QtCore import QMargins 

class demo(QMainWindow): 
    ... 

    def hideMe(self): 
     print('hide:', self.geometry()) 
     self.hide() 
     QTimer.singleShot(300, self.showMe) 

    def showMe(self): 
     print('show1:', self.geometry()) 
     hack = QMargins(0, 0, 0, 1) 
     self.setGeometry(self.geometry() + hack) 
     self.show() 
     self.setGeometry(self.geometry() - hack) 
     print('show2:', self.geometry()) 

UPDATE

さらにいくつかの調査の後、はるかに簡単な解決策があるようです。ウィンドウが最初に表示される前に明示的にウィンドウのジオメトリが設定されている場合、後続のhide()/ show()の後に元の位置に戻ることはありません。この場合、他のハッキング/回避策は必要ありません。

+0

これは実際にトリックです。しかし、それは本当に私にバグのように見えます!私はこれを調べて、それが機能ではない場合はバグを報告します;-)ありがとう! –

+1

これは "本当の" C++のQtプログラムでも作ることができるので、これは本当にバグだと思います。私はこれに関するレポートをhttps://bugreports.qt.io/browse/QTBUG-56579 –

+1

@TobiasLeupoldに投稿しました。私にとってはるかに簡単な解決策が見つかりました - 私の更新された答えを参照してください。 – ekhumoro

0

self.old_poshideMeshowMeで使用している場合は、私のために動作します(Linux)。しかし、この動作が変更された理由を私は知らない、またはそれはバグであるかどうか -

def hideMe(self): 
    self.old_pos = self.pos() 
    self.hide() 
    QTimer.singleShot(300, self.showMe) 

def showMe(self): 
    self.show() 
    self.move(self.old_pos) 
+0

私はこれを前に試しましたが、ここでは何も変わりません。 Qt4のバージョンが動作する理由(元の投稿の私の編集を参照)とQt5のバージョンは(インポート文によってのみ異なる)Qt4のバージョンが動作する理由を知ることができれば嬉しいです。 –

1

これは実際にはバグのようです。

その他の回避策は次のように、代わりにウィジェットののQWindow位置を設定することができます

windowHandle()->setPosition(windowHandle()->position()); 

またはshow()前WA_Moved属性を設定:

setAttribute(Qt::WA_Moved); 

は私がekhumoroの答えは最高だと思います。回避策を使用する場合は、暗黙のハックではなく明示的にしてください。

+0

それは論争していません。問題は後でウィンドウを動かすことです。 OPは 'show();することができました。 qt4ではmove(pos()) 'を実行しますが、それはqt5では機能しません。 – ekhumoro

+0

説明をありがとう、私は答えを修正しました。 –

関連する問題