2016-03-05 215 views
2

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

下面是代码:

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小部件在屏幕上绘制。先谢谢您的帮助。

回答

2

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

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

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

右....为什么它与'QDialog'工作,而不是? –

+0

@DanielePantaleone。如果一个'QWidget'有一个父对象,但是'QDialog'不能是一个顶级窗口。在OP示例中,如果'exampleWidget'被赋予了一个父项,它将作为列表窗口小部件下方的子窗口小部件显示(但您必须调整主窗口的大小才能看到它)。这也将揭示设置父项的一个侧面问题,因为每次调用'buildExamplePopup'都会创建一个* new *小部件(即以前的小部件不会被销毁,因为Qt仍然有对它的引用)。所以最好使用'popup.setAttribute(Qt.WA_DeleteOnClose)'来避免这个问题。 – ekhumoro

1

我真的不知道为什么它不能与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信号时隙处理器(你不应该声明插槽,静态)。