1

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

4

1 回答 1

1

在另一个问题的答案中不要解释问题的原因,所以在我的回答中会尽量涵盖

解释:

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)

解决方案:

所以有以下解决方案:

  • 利用作为父级传递给 self 的内容,您可以使用 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))
于 2019-05-03T10:35:55.533 回答