Добавьте кнопку «Развернуть» в диалоговое окно PyQt4 и держите диалоговое окно в центре родительского окна.

У меня есть диалог с большим текстовым полем. Я хочу, чтобы пользователь мог развернуть диалоговое окно. Я уже пробовал следующие варианты (XML_Editor является экземпляром QDialog):

XML_Editor.setWindowFlags(QtCore.Qt.Window or QtCore.Qt.WindowMaximizeButtonHint) -- показывает кнопку "Развернуть", но диалоговое окно не центрируется по отношению к ней. родитель больше

XML_Editor.setWindowFlags(QtCore.Qt.Dialog or QtCore.Qt.WindowMaximizeButtonHint or QtCore.Qt.CustomizeWindowHint) -- без эффекта

Теперь мой вопрос: как мне добиться, чтобы кнопка «Развернуть» отображалась, а диалоговое окно всплывало по центру w.r.t. родитель? Большинство ресурсов в Интернете, кажется, сосредоточены на том, как избавиться от кнопки «Развернуть». Любые идеи, как добиться обратного?

Основная цель — Ubuntu 10.04 (конфигурация по умолчанию), было бы здорово, если бы она работала и на Windows, и на Mac.

Я ценю любой намек. Заранее спасибо.


person krlmlr    schedule 23.01.2012    source источник
comment
Очень похоже на stackoverflow .com/questions/4699808/ . Там тоже нет реального решения :-(   -  person krlmlr    schedule 24.01.2012


Ответы (2)


Различные оконные менеджеры на основных платформах будут вести себя несколько по-разному, поэтому будет сложно найти решение, которое со 100% гарантией будет работать во всех случаях.

Использование по умолчанию windowFlags в Linux KDE создает диалог с кнопками контекста, максимизации, минимизации и закрытия; но с Windows XP есть только контекст и кнопка закрытия.

Для большинства платформ, по-видимому, необходимо установить по крайней мере флаги WindowSystemMenuHint и WindowMaximizeButtonHint, чтобы убедиться, что кнопка максимизации присутствует.

Чтобы убедиться, что диалоговое окно остается в центре родительского окна, просто передайте ссылку на родителя в конструкторе диалогового окна.

(Обратите внимание, что при объединении флагов вы должны использовать оператор побитовое ИЛИ |. В ваших примерах вы используете логический оператор ИЛИ or, который выберет первый не- нулевое значение, но игнорируйте остальные).

В следующем примере создается диалоговое окно по центру с кнопкой развертывания для меня как в Linux KDE, так и в Windows XP:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.button = QtGui.QPushButton('Show Dialog', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QHBoxLayout(self)
        layout.addWidget(self.button)

    def handleButton(self):
        dialog = QtGui.QDialog(self)
        dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        dialog.setWindowFlags(dialog.windowFlags() |
                              QtCore.Qt.WindowSystemMenuHint |
                              QtCore.Qt.WindowMinMaxButtonsHint)
        dialog.resize(160, 120)
        dialog.show()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    window.resize(320, 240)
    sys.exit(app.exec_())
person ekhumoro    schedule 23.01.2012
comment
Спасибо за пояснение относительно |, а также за код. К сожалению, до сих пор нет успеха в моей версии Unity. Похоже, что это зависит от оконного менеджера, как указано в stackoverflow.com/questions/4699808/ . Он надежно работает с QtCore.Qt.Window в качестве флага окна, поэтому я думаю, что буду использовать это решение, учитывая, что моя кодовая база уже содержит аналогичный случай. Я приму ваш ответ. - person krlmlr; 24.01.2012
comment
Замена dialog.windowFlags() на Qt.Window у меня работает в Manjaro Cinnamon, в PyQt5. - person Jason; 06.05.2019

Попробуйте получить геометрию родительского окна, а затем переместите диалоговое окно в его центр, например:

QRect pw = parent_widget->getGeometry();
XML_Editor.move(pw.center() - XML_Editor->rect().center());
person Gianluca    schedule 23.01.2012
comment
Спасибо за подсказку. Пробуя это, я понял, что родительский виджет не является главным окном. - person krlmlr; 23.01.2012