如何为每个点击的项目打开一个新窗口?

时间:2013-12-02 12:19:49

标签: python window pyqt

我使用getOpenFileNames选择几个文件并将它们放在QListWidget中。我还设法通过双击带有标题文件名的项目来打开一个窗口。但是,如果我点击另一个项目,它会关闭上一个窗口。

如何为我点击的每个项目打开一个窗口而不关闭其他项目?

目的是对QListWidget中的每个数据文件执行数学运算,我想在屏幕上同时显示每个数据集,然后保存修改后的数据。

from PyQt4 import QtCore, QtGui
from dataGet.GetVar import Get
from datapath import *
import sys

class Widget(QtGui.QWidget):

    def __init__(self, item, parent = None):
        super(Widget, self).__init__(parent)

        horiz = 600
        vert  = 600
        self.setGeometry(self.width()/2, self.height()/2,horiz,vert)    
        self.setWindowTitle(item)

class MainWindow(QtGui.QMainWindow):  
    def __init__(self, parent=None):
        super(MainWindow,self).__init__(parent)

        self._setupActions()
        self._setupList()
        self._setupUi()

    def _addFiles(self):
        files = QtGui.QFileDialog.getOpenFileNames(self,"Open File", dirpath,"txt Files    (*.txt)")

        self.stringlist = []
        for string in files:
            self.stringlist.append(string)       

        self.flightlist.addItems(self.stringlist)

        self.flightlist.itemDoubleClicked.connect(self._openwidgets)

    def _getData(self):
        #get variables from file
        self._addFiles
        var = Get(self._addFiles,'Ozo').Var()   

    def _openwidgets(self):

        item = self.flightlist.currentItem().text()        
        self.plotwidget = Widget(item)
        self.plotwidget.show()

    def _setupActions(self):
        self.exitAct = QtGui.QAction(QtGui.QIcon(':/images/exit.png'),"E&xit", self,     shortcut="Ctrl+Q",
        statusTip="Exit", triggered=self.close)  

        self.addFilesAct = QtGui.QAction(QtGui.QIcon(':/images/open.png'),"Add &Files", self, shortcut=QtGui.QKeySequence.Open,
        statusTip="add files", triggered=self._addFiles)     

    def _setupList(self):
        #Build the flightlist selection
        self.flightlist = QtGui.QListWidget(self)

    def _setupUi(self):
        # Window size
        horiz = 500
        vert  = 500
        self.setGeometry(self.width()/2, self.height()/2,horiz,vert)
        self.setWindowTitle("try-1.0")

        #MenuBar
        self.FileMenu = self.menuBar().addMenu("&File")
        self.FileMenu.addAction(self.addFilesAct)
        self.FileMenu.addSeparator();
        self.FileMenu.addAction(self.exitAct)

        #FileList
        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(self.flightlist)  

        widget = QtGui.QWidget()
        widget.setLayout(mainLayout)

        self.setCentralWidget(widget)

def main():

    app = QtGui.QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()          

1 个答案:

答案 0 :(得分:2)

_openwidgets(self)中,您将新创建的窗口小部件的对象设置为self.plotwidget,当您创建另一个窗口小部件时,它的对象存储在同一个变量中,之前创建的窗口会丢失它的引用,因此窗口由系统关闭。 (只要至少有一个变量包含它的对象,窗口就会保持打开状态)

如果您想要打开所有窗口,请尝试将对象保存在list中,如下所示:

window = Widget(self.flightlist.currentItem().text())
window.show()
self.plotwidgets.append(window)

注意:不要忘记在self.plotwidgets__init__()声明list