将QMessageBox移动到屏幕的右下角。

4
我想将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()

我认为在显示 msgBox 之前,它的框架(大小)未被定义,因此您正在使用无效的值进行计算。 - Marek R
@MarekR 看来你是对的,当我把 moveToBottomRight(msgBox) 放在 msgBox.show() 后面时,它按照我的要求工作了。但是,msgBox 首先会在原始位置显示,然后立即移动到目标位置,如何让它直接在目标位置显示,而不是首先在原始位置显示? - iMath
如果在获取其框架几何图形之前调用 msgBox.ensurePolished();,@iMath是否能正常工作? - thuga
@MarekR 在将代码更改为这样之后,代码如预期地工作了 codepad.org/KiifTwPB - iMath
@thuga 在将代码更改为这样之后,它按预期工作了 codepad.org/KiifTwPB - iMath
1个回答

1

msgBox.frameGeometry()无法获得有效值,因为消息框没有显示。您应该使用sizeHint(),如下:

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

sizeHint 保存了小部件的推荐大小。如果小部件有一个布局,它的默认实现将返回布局的首选大小。


我在Win7上测试了您的建议,事实是msgBox被任务栏部分遮挡了,这不是我想要的。 - iMath
你尝试过使用screenGeometry()而不是availableGeometry()吗? - Nejat
当屏幕尺寸改为screenGeometry()时,更多的区域被隐藏了。 - iMath
然后,您可以使用类似于 screenGeometry = QApplication.desktop().availableGeometry().adjusted(0,0,0,-100) 的内容来调整屏幕几何底部。您可以将 100 的值更改为适当的值。 - Nejat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接