2011-11-09 16 views
1

添付のスクリプト例では、MyDialogの親を20行目に自分自身を空白のままにしておくと、MyDialogのインスタンスが正しく表示されないのはなぜですか?最初に私はショートカットがどうにかして動作しなくなったと思ったが、明らかにそれはそうではない。tインスタンシエーションで親を設定すると、ダイアログが正しく表示されないのはなぜですか?

この場合、親が設定されているかどうかは実際には違いはありませんが、実際には親を設定する必要があります。

私はここで何かが分かりませんか?

import sys 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class MyDialog(QDialog): 
    def __init__(self, parent=None): 
     QDialog.__init__(self, parent) 
     self.setWindowFlags(Qt.FramelessWindowHint) 
     self.setFocusPolicy(Qt.StrongFocus) 
     label = QLabel(self) 
     label.setText("World") 
     hbox = QHBoxLayout() 
     hbox.addWidget(label) 
     self.setLayout(hbox) 

class MainWindow(QMainWindow): 
    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent) 
     self.my_dialog = MyDialog() 
     #self.my_dialog = MyDialog(self) 
     label = QLabel(self) 
     label.setText("Hello") 
     self.setCentralWidget(label) 
     shortcut = QShortcut(QKeySequence(Qt.Key_Tab), self, self.show_my_dialog) 
     shortcut.setContext(Qt.ApplicationShortcut) 
     self.show() 
    def show_my_dialog(self): 
     md = self.my_dialog 
     if md.isVisible(): 
      md.hide() 
      print 'hide' 
     else: 
      md.show() 
      print 'show' 

def main(): 
    app = QApplication([]) 
    main_window = MainWindow() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

どのように正しく表示されないのか詳しく説明できますか? –

+0

全く表示されません。スクリプトは 'Tab'を押したときに' hide 'と 'show'をコンソールに出力するので、ショートカットは機能しますが、' md.show() 'は効果がないようです。面白いことに、 'self.setWindowFlags(Qt.FramelessWindowHint)'行を削除すると、ダイアログが正しく表示されます。 – c00kiemonster

答えて

2

私のマシン(Kubuntu 11.10)では動作しています。 Dialogの親がNoneの場合、フレームなしの別のウィンドウが開き、タスクバーに2つのエントリがあります。メインウィンドウを閉じると、ダイアログが表示されます。

Windowsを使用している場合は、説明した動作が関連している可能性があります。たぶん、ウィンドウが表示され、それは他のウィンドウのすぐ後ろにありますか?

ダイアログの親がメインウィンドウの場合、ラベルの左上隅にあるフレームなしダイアログがメインウィンドウ内に表示されます。あなたはこのinfoに興味があるかもしれない

ダイアログウィンドウは、主に短期的なタスク とユーザとの短い通信に使用トップレベルウィンドウです。 QDialogsはモーダルでもよいし、 のモーダルでもよい。 QDialogは戻り値を提供でき、 デフォルトボタンを持つことができます。 QDialogsは、setSizeGripEnabled()を使用して、右下隅の にQSizeGripを持つこともできます。

QDialog( Qt :: Dialop型を持つ他のウィジェット)は、親ウィジェット をQtの他のクラスと少し違って使用します。ダイアログは常に トップレベルウィジェットですが、親がある場合、デフォルト位置は となります( トップレベル自体ではない場合)。親のタスクバーエントリも共有します。

QWidget :: setParent()関数のオーバーロードを使用して、QDialogウィジェットの 所有権を変更します。この関数を使用すると、子孫ウィジェットのウィンドウフラグを明示的に に設定できます。オーバーロードされた 関数を使用すると、ウィジェットのウィンドウシステム のプロパティを指定するウィンドウフラグがクリアされます(特に、Qt :: Dialog フラグがリセットされます)。

+0

それは良いリンクです。ありがとう! – c00kiemonster

関連する問題