Почему мой диалог не отображается должным образом, когда я устанавливаю его родителя при создании экземпляра? - PullRequest
2 голосов
/ 09 ноября 2011

В прилагаемом примере скрипта, почему экземпляр MyDialog не будет отображаться должным образом, если я установил для родителя MyDialog значение self в строке 20 вместо того, чтобы оставить его пустым?Сначала я подумал, что ярлык как-то перестал работать, но, очевидно, это не так.

В этом случае на самом деле не имеет значения, установлен родитель, но в моем реальном случае мне нужен родитель длябыть установленным.

Я что-то упускаю здесь очевидное?

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 Ответ

2 голосов
/ 16 ноября 2011

На моей машине (Kubuntu 11.10) он работает.Если родительский диалог None - он открывает другое безрамное окно, и у меня есть две записи на панели задач.Если я закрою главное окно, диалоговое окно останется.

Если вы используете Windows - описанное вами поведение может быть связано с ним.Может быть, окно показывается, оно просто за другими окнами?

Если родительский элемент диалогового окна является основным окном - в главном окне отображается диалоговое окно без рамок - в верхнем левом углу рядом с надписью.* Вас может заинтересовать эта информация :

Диалоговое окно - это окно верхнего уровня, в основном используемое для краткосрочных задач и краткого общения с пользователем.QDialogs может быть модальным или немодальным.QDialogs может предоставить возвращаемое значение, и они могут иметь кнопки по умолчанию.QDialogs также может иметь QSizeGrip в правом нижнем углу, используя setSizeGripEnabled ().

Обратите внимание, что QDialog (любой другой виджет, имеющий тип Qt :: Dialog) использует родительский виджет немного иначе, чем другие классы в Qt.Диалог всегда является виджетом верхнего уровня, но если у него есть родитель, его расположение по умолчанию центрируется поверх виджета верхнего уровня родителя (если это не сам верхний уровень).Он также поделится записью родительской панели задач.

Используйте перегрузку функции QWidget :: setParent (), чтобы изменить владельца виджета QDialog.Эта функция позволяет вам явно установить флажки окна перекрашенного виджета;использование перегруженной функции очистит флаги окна, определяющие свойства оконной системы для виджета (в частности, сбросит флаг Qt :: Dialog).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...