如何在屏幕上居中放置QMessageBox和QInputDialog? [英] How to center QMessageBox and QInputDialog on the screen?

查看:1339
本文介绍了如何在屏幕上居中放置QMessageBox和QInputDialog?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我具有此功能,可将对象居中放置在屏幕中间.

I have this function to center an object in the middle of the screen.

我想将QMainWindow,QInputDialog和QMessageBox居中.

I want to center a QMainWindow, QInputDialog and a QMessageBox.

这是我的消息框:

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:

This is my 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.

I can only center the QMainWindow.

逻辑是将对象移动到topLeft Point(screenWidth/2-objectWidth/2,screenHeight/2-objectHeight/2),但是我不知道自己在做什么.

The logic is to move the object into the topLeft Point (screenWidth/2 - objectWidth/2, screenHeight/2 - objectHeight/2) but I don't know what I am doing wrong.

推荐答案

-QMessageBox

对于QMessageBox,它是通过exec_()方法调整大小的,因此可能的解决方案是使用QTimer.singleShot()在显示后不久更改几何形状.

- QMessageBox

In the case of QMessageBox this is resized in the exec_() method, so a possible solution is to use QTimer.singleShot() to change the geometry a moment after being displayed.

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(),则默认情况下它将相对于它居中.


- QInputDialog

In the case of QInputDialog, the QInputDialog::getText() method is static, so the "self.cuadro" object is not the window since the window is created within that method. If you pass a parent to getText() then by default it will be centered with respect to that.

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

So if the QMainWindow is centered and assuming that QMainWindow is the self then it is not necessary to modify anything.

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

If instead the parent is not centered on the screen then there are 2 possible solutions:

  • 请勿使用静态方法并通过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_())
    

    这篇关于如何在屏幕上居中放置QMessageBox和QInputDialog?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆