PyQt5 - 调整大小(限制最大大小)输入对话框

PyQt5 - resize (limit maximum size) input dialog

我读到这个:How to resize 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 行和第 3 行之间添加 InputDialog.setFixedSite(self)。没有任何效果,它要么崩溃,要么创建第二个空 window。我在这里忽略了什么吗?

在其他问题的回答中没有解释问题的原因所以在我的回答中会尽量涵盖

解释:

getText()方法是一个静态方法,也就是说一个对象没有被使用,在方法内部如果被使用但是不能访问。因此,您创建的 InputDialog 不是您显示的那个,您可以使用以下代码进行检查,因为您将看到 2 windows:

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_())
  1. 不使用 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))