python - 随着主窗口大小的调整而调整 QDialog 的大小

标签 python python-3.x pyside2 qdialog

有一个带有按钮的 QWidget,单击时会弹出一个 QDialog。对话框的 setParent 设置为 QWidget。每次单击该按钮时,对话框都会显示特定的大小。我不知道为什么。如果为对话框设置了尺寸,那么它当然会采用该尺寸。但是,无论窗口大小如何,如何使对话框填满整个窗口并占据窗口的大小呢?例如,如果窗口大小为 700、600,则对话框应继承该大小,并且如果调整窗口大小或最大化,则对话框应在调整窗口大小时随窗口更改其大小。代码如下:

import sys
from PySide2.QtWidgets import *
from PySide2 import *


class Dialog(QDialog):
    def __init__(self):
    super(Dialog, self).__init__()
    self.move(0, 0)
    #self.resize(200, 100)
    self.setStyleSheet("background: teal;")
    self.setParent(MainWindow)


 def show_dialog():
    d = Dialog()
    d.exec_()


class MainWindow(QWidget):
    def __init__(self):
    super(MainWindow, self).__init__()
    self.resize(700, 600)

    btn = QPushButton()
    btn.setText("Click")

    layout = QVBoxLayout()
    layout.addWidget(btn)
    self.setLayout(layout)

    btn.clicked.connect(show_dialog)


if __name__ == '__main__':
   app = QApplication(sys.argv)
   MainWindow = MainWindow()
   MainWindow.show()
   sys.exit(app.exec_())

最佳答案

解决方案是使用resize()方法设置大小:

self.setParent(MainWindow)
self.resize(MainWindow.size())

虽然我不喜欢访问元素的方式,因为它可能会产生错误,但我已经重写了您的解决方案,如下所示:

import sys
from functools import partial

from PySide2.QtWidgets import QApplication, QDialog, QPushButton, QVBoxLayout, QWidget


class Dialog(QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setStyleSheet("background: teal;")


def show_dialog(w):
    d = Dialog(w)
    d.resize(w.size())
    d.exec_()


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(700, 600)
        btn = QPushButton()
        btn.setText("Click")
        layout = QVBoxLayout(self)
        layout.addWidget(btn)
        btn.clicked.connect(partial(show_dialog, self))


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

更新:

既然OP澄清了他的问题,那么解决方案保持不变:获取一个元素的大小并将其设置在另一个元素中,但在这种情况下,必须使用事件过滤器监视第一个元素的大小。

import sys
from functools import partial

from PySide2 import QtCore, QtWidgets


class Resizer(QtCore.QObject):
    sizeChanged = QtCore.Signal(QtCore.QSize)

    def __init__(self, widget):
        super(Resizer, self).__init__(widget)
        self._widget = widget
        self.widget.installEventFilter(self)

    @property
    def widget(self):
        return self._widget

    def eventFilter(self, obj, event):
        if self.widget is obj and event.type() == QtCore.QEvent.Resize:
            self.sizeChanged.emit(event.size())
        return super(Resizer, self).eventFilter(obj, event)


class Dialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setStyleSheet("background: teal;")


def show_dialog(w):
    d = Dialog(w)
    d.resize(w.size())
    resizer = Resizer(w)
    resizer.sizeChanged.connect(d.resize)
    d.exec_()


class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(700, 600)
        btn = QtWidgets.QPushButton()
        btn.setText("Click")
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(btn)
        btn.clicked.connect(partial(show_dialog, self))


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

关于python - 随着主窗口大小的调整而调整 QDialog 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61344024/

相关文章:

python:如果遇到异常则重试X次,如果没有则退出

python - 在 Python 中 pickle 类实例的字典

django - 当已经有ID字段时,如何使UUID字段成为默认字段

python-3.x - 无法构建 pyarrow(对于 python 3.7),错误消息为 ERROR : Could not build wheels for pyarrow which use PEP 517

python - 使用 tf.reduce_mean 与 tf.concat 进行灰度转换

python - Qt 带有圆角的消息

python - 如何在 QSystemTrayIcon 中左键单击时显示上下文菜单

python - 如何将一列值转换为可能离散的训练输出类?

python - 如何增加 opencv 中高半径值的椭圆弧分辨率?

python - QML 仪表未从 Python 更新