PyQt5 弹出窗口

Posted

技术标签:

【中文标题】PyQt5 弹出窗口【英文标题】:PyQt5 Popup Window 【发布时间】: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 小部件。提前感谢您的帮助。

【问题讨论】:

【参考方案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 信号槽处理程序(您不应将槽声明为静态)。

【讨论】:

以上是关于PyQt5 弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

delphi7怎么弹出子窗口

位置权限弹出窗口

JAVA咨询 消息框 最小化下能够弹出

如何使用调度程序在 Pyqt5 中显示弹出消息

我想用Swing实现单击按钮后能弹出一个新窗口!!这是我的代码!谢谢!

pyqt5快速上手基础篇7-弹出对话框