2016-03-05 209 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信號時隙處理器(你不應該聲明插槽,靜態)。