Изменить размер QDialog как MainWindow изменяет размер - PullRequest
2 голосов
/ 21 апреля 2020

Есть QWidget с кнопкой, которая вызывает QDialog при нажатии. setParent диалогового окна установлен в QWidget. При каждом нажатии кнопки появляется диалоговое окно с указанным размером c. Я не знаю почему. Если для диалогового окна задан размер, он, конечно же, подходит к этому размеру. Но как сделать так, чтобы диалог заполнял все окно и занимал размер окна, каким бы ни был размер окна? Например, если размер окна составляет 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_())

1 Ответ

2 голосов
/ 21 апреля 2020

Решение состоит в том, чтобы установить размер методом 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_())

Обновление:

Поскольку ОП уточнил свой вопрос, решение остается тем же: получить размер одного элемента и установить его в другое, но в этом случае размер первого должен отслеживаться с помощью фильтра событий.

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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...