【问题标题】:Resize QDialog as MainWindow resizes调整 QDialog 的大小作为 MainWindow 调整大小
【发布时间】:2020-04-21 12:52:52
【问题描述】:

有一个带有按钮的 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_())

【问题讨论】:

    标签: python python-3.x pyside2 qdialog


    【解决方案1】:

    解决办法是用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_())
    

    【讨论】:

    • 也许我的问题不清楚。为了清楚起见,我对其进行了编辑。我希望对话框调整大小,因为主窗口正在实时调整大小。两种给定的解决方案都各自工作,但调整大小仅在单击按钮时完成,而不是在对话框已经存在时调整主窗口大小时完成。
    • 完美!谢谢。
    猜你喜欢
    • 2014-02-17
    • 2013-08-01
    • 2018-11-06
    • 2014-09-01
    • 1970-01-01
    • 2010-10-16
    • 2016-11-21
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多