返回

如何在 QMainWindow 的中央小部件内居中 QDialog

python

PyQt5:如何在 QMainWindow 的中央小部件内居中 QDialog

问题

使用 PyQt5 时,我们可能需要在 QMainWindow 的中央小部件内居中显示 QDialog。为了实现此目的,我们需要解决以下问题:

  1. 调整 QDialog 的大小,使其与中央小部件的大小成比例
  2. 将 QDialog 居中显示,其中心点与中央小部件的中心点重合
  3. 如果可能,实现响应式居中,即 QDialog 的位置随着 QMainWindow 大小的变化而变化

解决方案

以下步骤可以帮助我们实现 QDialog 的居中显示和响应式:

1. 调整 QDialog 大小

dialog.resize(0.98 * centralWidget.width(), 0.98 * centralWidget.height())

2. 计算 QDialog 的中心点

dialogCenterX = centralWidget.rect().center().x() - (dialog.width() / 2)
dialogCenterY = centralWidget.rect().center().y() - (dialog.height() / 2)

3. 移动 QDialog

dialog.move(dialogCenterX, dialogCenterY)

4. 实现响应式

为了使 QDialog 在 QMainWindow 调整大小后仍然居中显示,我们需要将步骤 2 和步骤 3 与 QMainWindow 的 resizeEvent 方法连接:

def resizeEvent(self, event):
    # 重新计算 QDialog 的中心点
    dialogCenterX = self.centralWidget().rect().center().x() - (self.dialog.width() / 2)
    dialogCenterY = self.centralWidget().rect().center().y() - (self.dialog.height() / 2)

    # 移动 QDialog
    self.dialog.move(dialogCenterX, dialogCenterY)

示例代码

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)

        self.dialog = QtWidgets.QDialog()

        # 连接 resizeEvent 方法实现响应式
        self.dialog.resizeEvent = self.resizeEvent

    def resizeEvent(self, event):
        dialogCenterX = self.centralWidget.rect().center().x() - (self.dialog.width() / 2)
        dialogCenterY = self.centralWidget.rect().center().y() - (self.dialog.height() / 2)

        self.dialog.move(dialogCenterX, dialogCenterY)

    def showDialog(self):
        # 调整 QDialog 大小
        self.dialog.resize(0.98 * self.centralWidget.width(), 0.98 * self.centralWidget.height())

        # 计算 QDialog 的中心点
        dialogCenterX = self.centralWidget.rect().center().x() - (self.dialog.width() / 2)
        dialogCenterY = self.centralWidget().rect().center().y() - (self.dialog.height() / 2)

        # 移动 QDialog
        self.dialog.move(dialogCenterX, dialogCenterY)

        # 显示 QDialog
        self.dialog.show()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    window.showDialog()
    sys.exit(app.exec_())

常见问题解答

1. 如何隐藏 QDialog 的标题栏?

dialog.setWindowFlags(dialog.windowFlags() | QtCore.Qt.FramelessWindowHint)

2. 如何在 QDialog 中添加自定义按钮?

button = QtWidgets.QPushButton("关闭")
button.clicked.connect(dialog.close)
layout = QtWidgets.QVBoxLayout()
layout.addWidget(button)
dialog.setLayout(layout)

3. 如何让 QDialog 模态?

dialog.setWindowModality(QtCore.Qt.ApplicationModal)

4. 如何限制 QDialog 的最大/最小大小?

dialog.setMaximumSize(QtCore.QSize(500, 500))
dialog.setMinimumSize(QtCore.QSize(200, 200))

5. 如何使 QDialog 相对于某个窗口显示?

dialog.setParent(parentWindow, QtCore.Qt.Window)

结论

通过遵循本文中概述的步骤,我们可以轻松地在 QMainWindow 的中央小部件内居中显示 QDialog,并实现响应式。这将增强用户体验,并为创建交互式和美观的 PyQt5 应用程序提供灵活性和控制。