2015-02-04 3 views
3

Я хочу переместить QMessageBox в нижний правый угол экрана, следующий мой код, но не работает должным образом, кто-нибудь может объяснить почему? Как устранить проблему здесь?переместите QMessageBox в нижний правый угол экрана

import sys 

from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 


def moveToBottomRight(msgBox): 

    msgBox.addButton("重计", QMessageBox.ActionRole) 
    msgBox.addButton("停计", QMessageBox.ActionRole) 
    msgBox.addButton('继续', QMessageBox.ActionRole) 

    screenGeometry = QApplication.desktop().availableGeometry() 
    screenGeo = screenGeometry.bottomRight() 

    msgGeo = msgBox.frameGeometry() 

    msgGeo.moveBottomRight(screenGeo) 

    msgBox.move(msgGeo.topLeft()) 


def main(): 

    app = QApplication(sys.argv) 

    msgBox = QMessageBox() 
    moveToBottomRight(msgBox) 
    msgBox.show() 

    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
+0

Я думаю, прежде чем 'msgBox' покажет, что его кадр (размер) ti не определен, поэтому вы используете недопустимое значение для вычислений. –

+0

@MarekR кажется, что вы правы, когда вы устанавливаете moveToBottomRight (msgBox) после msgBox.show(), он работает так, как я хочу, но сначала показывает msgBox в исходной позиции, затем сразу же перемещается в позицию назначения, показывать в пункте назначения непосредственно без предварительного показа в исходной позиции? – iMath

+0

@iMath работает, если вы вызываете 'msgBox.ensurePolished();' перед тем, как получить геометрию кадра? – thuga

ответ

1

msgBox.frameGeometry() не получает действительное значение, это потому, что окно сообщения не отображается. Вы должны использовать sizeHint() как:

msgGeo = QRect(QPoint(0,0), msgBox.sizeHint()) 

sizeHint имеет рекомендуемый размер для виджета. По умолчанию реализация возвращает предпочтительный размер макета, если у виджета есть макет.

+0

Я протестировал ваше предложение на Win7 , факт заключается в том, что msgBox частично скрывается панель задач, этого я не хочу. – iMath

+0

Вы пробовали 'screenGeometry()' вместо 'availableGeometry()'? – Nejat

+0

при изменении на screenGeometry(), больше области скрыто – iMath

Смежные вопросы