Добавьте кнопку «Развернуть» в диалоговое окно PyQt4 и удерживайте его в центре родительского окна. - PullRequest
3 голосов
/ 23 января 2012

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

XML_Editor.setWindowFlags(QtCore.Qt.Window or QtCore.Qt.WindowMaximizeButtonHint) - показывает кнопку «Развернуть», но не центрирует диалог w.r.t. родитель больше

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 23 января 2012

Различные оконные менеджеры на основных платформах будут вести себя по-разному, поэтому будет сложно найти решение, которое гарантированно будет работать на 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_())
0 голосов
/ 23 января 2012

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

QRect pw = parent_widget->getGeometry();
XML_Editor.move(pw.center() - XML_Editor->rect().center());
...