【问题标题】:PyQt5 - resize (limit maximum size) input dialogPyQt5 - 调整大小(限制最大大小)输入对话框
【发布时间】:2019-05-03 10:11:32
【问题描述】:

我读到这个: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)。没有任何效果,它要么崩溃,要么创建第二个空窗口。我在这里忽略了什么吗?

【问题讨论】:

    标签: python pyqt pyqt5 qinputdialog


    【解决方案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)
    

    解决方案:

    所以有以下解决方案:

    • 利用作为父级传递给自身的内容,您可以使用 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))
    

    【讨论】:

    • 对不起,如果我遗漏了什么,但使用这两个例子,我仍然可以无限扩展对话框吗?
    • @FlyingThunder 将 dialog.setFixedSize(QtCore.QSize(500, 100)) 更改为 dialog.resize(QtCore.QSize(500, 100))
    • 当我测试它时没有任何区别
    • 就像我说的那样,对话框的大小应该是固定的,但默认情况下它似乎只有高度限制 - 我可以将其无限拉伸到宽度
    • 最后一个有效,tyvm!但我很好奇,你到底做了什么来解决这个问题
    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多