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

如何在屏幕上居中放置QMessageBox和QInputDialog?,第1张

如何在屏幕上居中放置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_())


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5653675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存