Добавете бутон за увеличаване към диалогов прозорец на 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