PyQt5 - диалог ввода изменения размера (ограничения максимального размера) - PullRequest
1 голос
/ 03 мая 2019

Я прочитал это: Как изменить размер QInputDialog, PyQt , но у меня это не сработало, так как похоже на PyQt4

Это мой фрагмент кода:

    def ImportURL(self):                     #URL dialog aufrufen
        InputDialog = QtWidgets.QInputDialog(self)
        i, okPressed = InputDialog.getText(self, "Import website", "Site to import:", QtWidgets.QLineEdit.Normal, "https://de.wikipedia.org/wiki/Wikipedia:Hauptseite")

        if okPressed:
            self.getWebsite(i)

И я попытался добавить .setFixedSize во 2-й строке.Я попытался добавить InputDialog.setFixedSite(self) между строками 2 и 3. Ничего не получалось, он либо вылетает, либо создает второе пустое окно.Я пропускаю что-то здесь?

1 Ответ

1 голос
/ 03 мая 2019

В ответах на другой вопрос не объясните причину проблемы, поэтому в моем ответе постараюсь максимально охватить

Объяснение:

Метод getText ()статический метод, который означает, что объект не используется внутри метода, если он используется, но он недоступен.Таким образом, InputDialog, который вы создаете, не тот, который вы показываете, и это вы можете проверить, используя следующий код, так как вы увидите 2 окна:

def ImportURL(self):
    InputDialog = QtWidgets.QInputDialog(self)
    InputDialog.show()
    i, okPressed = InputDialog.getText(self, "Import website", "Site to import:", QtWidgets.QLineEdit.Normal, "https://de.wikipedia.org/wiki/Wikipedia:Hauptseite")

    if okPressed:
        self.getWebsite(i)

Решения:

Итак, есть следующиерешения:

  • Используя то, что вы передали себе в качестве родителя, вы можете получить объект с помощью findChildren:
from PyQt5 import QtCore, QtGui, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        button = QtWidgets.QPushButton(
            "Open QInputDialog", clicked=self.ImportURL
        )
        vlay = QtWidgets.QVBoxLayout(self)
        vlay.addWidget(button)

    @QtCore.pyqtSlot()
    def ImportURL(self):
        QtCore.QTimer.singleShot(0, self.after_show)
        i, okPressed = QtWidgets.QInputDialog.getText(
            self,
            "Import website",
            "Site to import:",
            QtWidgets.QLineEdit.Normal,
            "https://de.wikipedia.org/wiki/Wikipedia:Hauptseite",
        )
        if okPressed:
            # self.getWebsite(i)
            print(i)

    @QtCore.pyqtSlot()
    def after_show(self):
        size = QtCore.QSize(500, 100)
        for d in self.findChildren(QtWidgets.QInputDialog):
            if d.isVisible():
                d.resize(size)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
Не используйте метод getText (), но создайте объект, который реализует ту же логику:
from PyQt5 import QtCore, QtGui, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        button = QtWidgets.QPushButton(
            "Open QInputDialog", clicked=self.ImportURL
        )
        vlay = QtWidgets.QVBoxLayout(self)
        vlay.addWidget(button)

    @QtCore.pyqtSlot()
    def ImportURL(self):
        dialog = QtWidgets.QInputDialog(self)
        dialog.resize(QtCore.QSize(500, 100))
        dialog.setWindowTitle("Import website")
        dialog.setLabelText("Site to Import")
        dialog.setTextValue(
            "https://de.wikipedia.org/wiki/Wikipedia:Hauptseite"
        )
        dialog.setTextEchoMode(QtWidgets.QLineEdit.Normal)
        if dialog.exec_() == QtWidgets.QDialog.Accepted:
            i = dialog.textValue()
            print(i)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

Обновление:

МакетQInputDialog имеет QLayout :: SetMinAndMaxSize, установленный как sizeConstraint, поэтому фиксированный размер не будет работать, хитрость заключается в том, чтобы изменить его на QLayout :: SetDefaultConstraint:

from functools import partial

# ...

@QtCore.pyqtSlot()
def ImportURL(self):
    dialog = QtWidgets.QInputDialog(self)
    dialog.setWindowTitle("Import website")
    dialog.setLabelText("Site to Import")
    dialog.setTextValue(
        "https://de.wikipedia.org/wiki/Wikipedia:Hauptseite"
    )
    dialog.setTextEchoMode(QtWidgets.QLineEdit.Normal)
    wrapper = partial(self.on_timeout, dialog)
    QtCore.QTimer.singleShot(0, wrapper)
    if dialog.exec_() == QtWidgets.QDialog.Accepted:
        i = dialog.textValue()
        print(i)

def on_timeout(self, dialog):
    lay = dialog.layout()
    lay.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
    dialog.setFixedSize(QtCore.QSize(500, 100))
...