【问题标题】:PyQt5 Popup WindowPyQt5 弹出窗口
【发布时间】:2016-03-05 05:13:17
【问题描述】:

我正在尝试使用 PyQt5 构建一个应用程序,当双击 QListWidget 中的项目时,它会弹出一个辅助窗口。

代码如下:

import sys
from PyQt5.QtWidgets import QWidget, QListWidget, QListWidgetItem, QLabel, QPushButton, QApplication


class exampleWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        listWidget = QListWidget(self)
        listWidget.itemDoubleClicked.connect(self.buildExamplePopup)

        names = ["Jack", "Chris", "Joey", "Kim", "Duncan"]

        for n in names:
            QListWidgetItem(n, listWidget)

        self.setGeometry(100, 100, 100, 100)
        self.show()

    @staticmethod
    def buildExamplePopup(item):
        name = item.text()
        exPopup = examplePopup(name)
        exPopup.setGeometry(100, 200, 100, 100)
        exPopup.show()


class examplePopup(QWidget):
    def __init__(self, name):
        super().__init__()

        self.name = name

        self.initUI()

    def initUI(self):
        lblName = QLabel(self.name, self)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = exampleWidget()
    sys.exit(app.exec_())

我希望在双击列表框中的一个名称时弹出第二个窗口,但我一辈子都无法在屏幕上绘制 examplePopup 小部件。提前感谢您的帮助。

【问题讨论】:

    标签: python-3.x pyqt5 popup


    【解决方案1】:

    弹出窗口没有显示,因为您没有保留对它的引用,因此一旦buildExamplePopup 返回,它就会被垃圾收集。

    您可以像这样轻松解决问题:

        def buildExamplePopup(self, item):
            name = item.text()
            self.exPopup = examplePopup(name)
            self.exPopup.setGeometry(100, 200, 100, 100)
            self.exPopup.show()
    

    【讨论】:

    • @DanielePantaleone。如果QWidget 有父窗口,则它不能是顶级窗口,但QDialog 可以。在 OPs 示例中,如果 exampleWidget 被赋予父级,它将作为子小部件出现在列表小部件下方(但您必须调整主窗口的大小才能看到它)。这也将揭示设置父级的一个附带问题,因为每次调用 buildExamplePopup 都会创建一个 new 小部件(即前一个小部件不会被破坏,因为 Qt 仍然有一个引用给它)。所以最好使用popup.setAttribute(Qt.WA_DeleteOnClose) 来避免这个问题。
    【解决方案2】:

    我真的不知道为什么它不适用于QWidget,因为如果第二个小部件在__main__ 内初始化,它确实可以工作。但是,您可以使用QDialog 来实现相同的结果:

    import sys
    
    from PyQt5.QtCore import pyqtSlot
    from PyQt5.QtWidgets import QWidget, QListWidget, QListWidgetItem, QLabel, QApplication, QDialog
    
    
    class ExampleWidget(QWidget):
    
        def __init__(self):
            super().__init__()
            listWidget = QListWidget(self)
            listWidget.itemDoubleClicked.connect(self.buildExamplePopup)
            for n in ["Jack", "Chris", "Joey", "Kim", "Duncan"]:
                QListWidgetItem(n, listWidget)
            self.setGeometry(100, 100, 100, 100)
            self.show()
    
        @pyqtSlot(QListWidgetItem)
        def buildExamplePopup(self, item):
            exPopup = ExamplePopup(item.text(), self)
            exPopup.setGeometry(100, 200, 100, 100)
            exPopup.show()
    
    
    class ExamplePopup(QDialog):
    
        def __init__(self, name, parent=None):
            super().__init__(parent)
            self.name = name
            self.label = QLabel(self.name, self)
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ex = ExampleWidget()
        sys.exit(app.exec_())
    

    我还更改了一些代码,将 @pyqtSlot 装饰器添加到 itemDoubleClicked 信号槽处理程序(您不应将槽声明为静态)。

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 2019-06-02
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多