如何在屏幕上居中放置QMessageBox和QInputDialog?
我有此功能可将对象居中放在屏幕中间。
我想居中QMainWindow,QInputDialog和QMessageBox。
这是我的MessageBox:
def _Warning(self,_type):
infoBox = QtWidgets.QMessageBox()
infoBox.setIcon(QtWidgets.QMessageBox.Warning)
infoBox.setWindowTitle("Warning")
if (_type=="File"):
infoBox.setText("The File Already exist in the current Directory")
else:
infoBox.setText("The Folder Already exist in the current Directory")
self.center(infoBox)
infoBox.exec_()
这是我的QInputDialog:
def AddFile_B(self):
self.cuadro = QInputDialog()
self.center(self.cuadro)
text, okPressed = self.cuadro.getText(self, "New File","File Name:", QLineEdit.Normal, "")
if okPressed and text != '':
file = File_Node(text)
verify = self.bonsai_B.addChild(file)
if (verify == True):
item = QtWidgets.QListWidgetItem(None,0)
self.TreeB.addItem(item)
else:
del file
self._Warning("File")
这是我的中心功能:
def center(self,object):
qtRectangle = object.frameGeometry()
centerPoint = QtWidgets.QDesktopWidget().availableGeometry().center()
qtRectangle.moveCenter(centerPoint)
object.move(qtRectangle.topLeft())
我只能居中QMainWindow。
逻辑是将对象移动到topLeft点(screenWidth / 2-objectWidth / 2,screenHeight /
2-objectHeight / 2),但是我不知道自己在做什么。
-
-QMessageBox
在
QMessageBox
此方法中调整尺寸的情况下exec_()
,因此可能的解决方案是QTimer.singleShot()
在显示后的瞬间使用几何形状进行更改。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_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_())
-