当我在实例化时设置其父对象时,为什么我的对话框不能正确显示?

时间:2011-11-09 03:04:36

标签: qt pyqt show

在附带的示例脚本中,当我在第20行将MyDialog的父级设置为self而不是将其留空时,为什么MyDialog实例不能正确显示?首先,我认为捷径已经停止了工作,但显然事实并非如此。

在这种情况下,父设置是否设置并没有任何区别,但在我的实际情况下,我需要设置父设置。

我错过了一些明显的东西吗?

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()

1 个答案:

答案 0 :(得分:2)

在我的机器上(Kubuntu 11.10),它正在工作。 如果Dialog的父级为None - 它会打开另一个无框窗口,并且我在任务栏中有两个条目。如果我关闭主窗口,则对话框仍然存在。

如果您使用的是Windows - 您描述的行为可能与之相关。也许窗口显示,它就在其他窗口后面?

如果Dialog的父级是主窗口 - 无框对话框显示在主窗口内 - 位于标签附近的左上角。

您可能对此info

感兴趣
  

对话窗口是一个主要用于短期任务的顶级窗口   并与用户进行简短的沟通。 QDialogs可能是模态的或   无模式。 QDialogs可以提供返回值,他们可以提供   默认按钮。 QDialogs也可以拥有QSizeGrip   右下角,使用setSizeGripEnabled()。

     

注意QDialog(一个   任何其他类型为Qt :: Dialog的小部件都使用父小部件   与Qt中的其他类略有不同。对话框始终是一个   顶级窗口小部件,但如果它有父窗口,则其默认位置为   以父级的顶级窗口小部件为中心(如果不是   顶级本身)。它还将共享父级的任务栏条目。

     

使用   更改QWidget :: setParent()函数的重载   QDialog小部件的所有权。此功能允许您明确   设置重新定位的小部件的窗口标志;使用重载   function将清除指定窗口系统的窗口标志   窗口小部件的属性(特别是它将重置Qt :: Dialog   标志)。