【问题标题】:Why won't my dialog show properly when I set its parent on instantiation?当我将其父级设置为实例化时,为什么我的对话框不能正确显示?
【发布时间】:2011-12-24 23:35:45
【问题描述】:

在附加的示例脚本中,当我在第 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()

【问题讨论】:

  • 您能否详细说明它无法正常显示的原因?
  • 它根本不显示。当按下Tab 时,脚本将'hide''show' 分别输出到控制台,因此快捷方式有效,但md.show() 似乎没有任何效果。我在 Windows 和 OS X 上得到了相同的行为。有趣的是,删除 self.setWindowFlags(Qt.FramelessWindowHint) 行后,对话框将正确显示。

标签: qt pyqt show


【解决方案1】:

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

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

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

您可能对此info 感兴趣:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多