在
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, QtWidgetsdef center(window):
# https://wiki.qt.io/How_to_Center_a_Window_on_the_Screenwindow.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 sysapp = QtWidgets.QApplication(sys.argv)w = Widget()w.show()sys.exit(app.exec_())
继续使用静态方法,并使用findChildren()获取窗口
from functools import partial
from PyQt5 import QtCore, QtWidgetsdef center(window):
# https://wiki.qt.io/How_to_Center_a_Window_on_the_Screenwindow.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 sysapp = QtWidgets.QApplication(sys.argv)w = Widget()w.show()sys.exit(app.exec_())
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)