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

发布于 2021-01-29 18:19:13

我有此功能可将对象居中放在屏幕中间。

我想居中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),但是我不知道自己在做什么。

关注者
0
被浏览
271
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    -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, 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_())
      


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看