2011-11-09 4 views
1

첨부 된 예제 스크립트에서 MyDialog의 부모를 비워 두지 않고 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

내 컴퓨터 (쿠분투 11.10)에서 작동합니다. Dialog의 부모가 없음 인 경우 - 프레임이없는 또 다른 창이 열리고 작업 표시 줄에 두 개의 항목이 있습니다. 주 창을 닫으면 대화 상자가 남아 있습니다.

Windows를 사용하는 경우 설명 된 동작이 관련 될 수 있습니다. 어쩌면 창이 보입니다. 다른 창 바로 뒤에 있습니까?

대화 상자의 상위 창이 기본 창인 경우 - 프레임이없는 대화 상자가 레이블 근처의 왼쪽 상단 모서리에 표시됩니다.

info에 관심이있을 수 있습니다

대화 창은 대부분 단기 작업 및 사용자와의 간단한 통신에 사용되는 톱 레벨 윈도우입니다. QDialogs는 모달이거나 모덜리스 일 수 있습니다. QDialog는 반환 값을 제공 할 수 있으며 기본 버튼을 가질 수 있습니다. QDialogs는 setSizeGripEnabled()를 사용하여 오른쪽 하단의 오른쪽 아래에 QSizeGrip을 가질 수 있습니다.

QDialog ( 다른 유형의 Qt :: Dialog가있는 위젯)은 상위 위젯 을 Qt의 다른 클래스와 약간 다르게 사용합니다. 대화 상자는 항상 최상위 위젯이지만, 부모가있는 경우 기본 위치는 최상위 자체가 아닌 경우 부모의 최상위 위젯 가운데에 중심이있는 입니다. 또한 부모의 작업 표시 줄 항목을 공유합니다.

QWidget :: setParent() 함수의 오버로드를 사용하여 QDialog 위젯의 소유권을 (으)로 변경하십시오. 이 함수는 명시 적으로 부모가 된 위젯의 창 플래그를 설정할 수 있습니다; 오버로드 된 함수를 사용하면 위젯에 대한 윈도우 시스템 속성을 지정하는 윈도우 플래그를 지울 수 있습니다 (특히 Qt :: Dialog 플래그를 재설정 함).

+0

좋은 링크입니다. 감사! – c00kiemonster

관련 문제