栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在屏幕上居中放置QMessageBox和QInputDialog?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在屏幕上居中放置QMessageBox和QInputDialog?

-QMessageBox

QMessageBox
此方法中调整尺寸的情况下
exec_()
,因此可能的解决方案是
QTimer.singleShot()
在显示后的瞬间使用几何形状进行更改。

from functools import partialfrom PyQt5 import QtCore, QtWidgetsdef center(window):    # https://wiki.qt.io/How_to_Center_a_Window_on_the_Screen    window.setGeometry(        QtWidgets.QStyle.alignedRect( QtCore.Qt.LeftToRight, QtCore.Qt.AlignCenter, window.size(), QtWidgets.qApp.desktop().availableGeometry(),        )    )class Widget(QtWidgets.QWidget):    def __init__(self, parent=None):        super().__init__(parent)        self.btn_warning = QtWidgets.QPushButton( "Open QMessageBox", clicked=self.open_qmessagebox        )        lay = QtWidgets.QVBoxLayout(self)        lay.addWidget(self.btn_warning)        center(self)    @QtCore.pyqtSlot()    def open_qmessagebox(self):        infoBox = QtWidgets.QMessageBox()        infoBox.setIcon(QtWidgets.QMessageBox.Warning)        infoBox.setWindowTitle("Warning")        infoBox.setText("The XXX Already exist in the current Directory")        wrapper = partial(center, infoBox)        QtCore.QTimer.singleShot(0, wrapper)        infoBox.exec_()if __name__ == "__main__":    import sys    app = QtWidgets.QApplication(sys.argv)    w = Widget()    w.show()    sys.exit(app.exec_())

-QInputDialog

对于QInputDialog,QInputDialog :: getText()方法是静态的,因此“
self.cuadro”对象不是窗口,因为该窗口是在该方法中创建的。如果将父级传递给getText(),则默认情况下它将相对于此居中。

因此,如果QMainWindow居中并假定QMainWindow是自身,则无需修改任何内容。

相反,如果父母不在屏幕上居中,则有两种可能的解决方案:

  • 不要使用静态方法并通过QInputDialog实例实现逻辑:

    from functools import partial
    from PyQt5 import QtCore, QtWidgets

    def center(window):
    # https://wiki.qt.io/How_to_Center_a_Window_on_the_Screen

    window.setGeometry(    QtWidgets.QStyle.alignedRect(        QtCore.Qt.LeftToRight,        QtCore.Qt.AlignCenter,        window.size(),        QtWidgets.qApp.desktop().availableGeometry(),    ))

    class Widget(QtWidgets.QWidget):
    def init(self, parent=None):
    super().init(parent)

        self.btn_inputdialog = QtWidgets.QPushButton(        "Open QInputDialog", clicked=self.open_qinputdialog    )    lay = QtWidgets.QVBoxLayout(self)    lay.addWidget(self.btn_inputdialog)    center(self)@QtCore.pyqtSlot()def open_qinputdialog(self):    dialog = QtWidgets.QInputDialog(self)    dialog.setWindowTitle("New File")    dialog.setLabelText("File Name:")    dialog.setTextEchoMode(QtWidgets.QLineEdit.Normal)    dialog.setTextValue("")    wrapper = partial(center, dialog)    QtCore.QTimer.singleShot(0, wrapper)    text, okPressed = (        dialog.textValue(),        dialog.exec_() == QtWidgets.QDialog.Accepted,    )    if okPressed and text:        print(text)

    if name == “main”:
    import sys

    app = QtWidgets.QApplication(sys.argv)w = Widget()w.show()sys.exit(app.exec_())
  • 继续使用静态方法,并使用findChildren()获取窗口

    from functools import partial
    from PyQt5 import QtCore, QtWidgets

    def center(window):
    # https://wiki.qt.io/How_to_Center_a_Window_on_the_Screen

    window.setGeometry(    QtWidgets.QStyle.alignedRect(        QtCore.Qt.LeftToRight,        QtCore.Qt.AlignCenter,        window.size(),        QtWidgets.qApp.desktop().availableGeometry(),    ))

    class Widget(QtWidgets.QWidget):
    def init(self, parent=None):
    super().init(parent)

        self.btn_inputdialog = QtWidgets.QPushButton(        "Open QInputDialog", clicked=self.open_qinputdialog    )    lay = QtWidgets.QVBoxLayout(self)    lay.addWidget(self.btn_inputdialog)    center(self)@QtCore.pyqtSlot()def open_qinputdialog(self):    parent = self    dialogs = parent.findChildren(QtWidgets.QInputDialog)    def onTimeout():        dialog, *_ = set(parent.findChildren(QtWidgets.QInputDialog)) - set(dialogs)        center(dialog)    QtCore.QTimer.singleShot(0, onTimeout)    text, okPressed = QtWidgets.QInputDialog.getText(        parent, "New File", "File Name:", QtWidgets.QLineEdit.Normal, ""    )    if okPressed and text:        print(text)

    if name == “main”:
    import sys

    app = QtWidgets.QApplication(sys.argv)w = Widget()w.show()sys.exit(app.exec_())


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/651535.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号