当 MainWindow 调整大小时调整 QDialog 的大小
Resize QDialog as MainWindow resizes
有一个带有按钮的 QWidget,单击它会弹出一个 QDialog。对话框的setParent设置为QWidget。每次单击按钮时,对话框都会显示一个特定的大小。我不知道为什么。如果为对话框设置了大小,它当然会显示该大小。但是如何使对话框填满整个 window 并占据 window 的大小,无论 window 大小是多少?例如,如果 window 大小为 700、600,则对话框应继承该大小,如果 window 调整大小或最大化,对话框应随 window 更改其大小正在调整大小。这是代码:
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_())
有一个带有按钮的 QWidget,单击它会弹出一个 QDialog。对话框的setParent设置为QWidget。每次单击按钮时,对话框都会显示一个特定的大小。我不知道为什么。如果为对话框设置了大小,它当然会显示该大小。但是如何使对话框填满整个 window 并占据 window 的大小,无论 window 大小是多少?例如,如果 window 大小为 700、600,则对话框应继承该大小,如果 window 调整大小或最大化,对话框应随 window 更改其大小正在调整大小。这是代码:
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_())