在PySide中创建同一个类的另一个窗口

时间:2018-05-15 10:44:51

标签: python pyside

我正在使用PySide创建一个小型GUI程序。我在创建同一个类的另一个对象时遇到了困难。我想要做的是,当点击MainWindow上的按钮时,它应该创建另一个同一类的独立窗口。

import sys 
from PySide import QtCore, QtGui 

class Sticky(QtGui.QMainWindow):
    def __init__(self,parent = None):
        QtGui.QMainWindow.__init__(self,parent)
        self.initUI()

    def initUI(self):
        ....
        self.addToolBarElements()
        ....
        self.show()

    def addToolBarElements(self):
        ....
        self.newwindow = QtGui.QAction(QtGui.QIcon(os.path.join(os.path.dirname(__file__),'icons/new.png')),"New Note",self)
        self.newwindow.setStatusTip("New")
        self.newwindow.triggered.connect(newwindow)

        self.toolBar.addAction(self.newwindow)

    def newwindow(self):
        #how to create new object of same class

def run():
    app = QtGui.QApplication(sys.argv)
    notes = Sticky()
    sys.exit(app.exec_()) 

以下是我的尝试:

我尝试过多处理,但我不太了解。我尝试再次调用run()方法,但它给出了错误。

1 个答案:

答案 0 :(得分:0)

不要使用相同的名称调用2个不同的元素,在您的情况下self.newwindow引用QAction作为类的方法,避免它,这是一种容易提交的错误但是很难找到。

到了这一步,你只需要创建一个类的新对象,但问题是垃圾收集器会消除它,避免它有2个可能的选项,第一个是使新的窗口成员该课程,或第二次存储在一个列表中,这是我选择的那个,因为我认为你想要有几个窗口。

import sys 
import os

from PySide import QtCore, QtGui 

class Sticky(QtGui.QMainWindow):
    def __init__(self,parent = None):
        QtGui.QMainWindow.__init__(self,parent)
        self.others_windows = []
        self.initUI()

    def initUI(self):
        self.addToolBarElements()
        self.show()

    def addToolBarElements(self):
        self.toolBar = self.addToolBar("toolBar")
        self.newwindow = QtGui.QAction(QtGui.QIcon(os.path.join(os.path.dirname(__file__),'icons/new.png')), "New Note",self)
        self.newwindow.setStatusTip("New")
        self.newwindow.triggered.connect(self.on_newwindow)

        self.toolBar.addAction(self.newwindow)

    def on_newwindow(self):
        w = Sticky()
        w.show()
        self.others_windows.append(w)

def run():
    app = QtGui.QApplication(sys.argv)
    notes = Sticky()
    sys.exit(app.exec_()) 

run()