需要使用PyQt4实现QWidget实例化

时间:2013-05-24 11:27:58

标签: python qt widget pyqt instance

此代码有效:

from PyQt4 import QtGui
import sys

app=QtGui.QApplication(sys.argv)


window1=QtGui.QWidget()
window1.show()

window2=QtGui.QWidget()
window2.show()

但这并不是:

from PyQt4.QtGui import *
import sys

class window(QMainWindow):
    def __init__(self):
        super(window, self).__init__()
        self.w=QWidget()
        self.w.show()

app=QApplication(sys.argv)
window()
window()

如何通过实例化类窗口来创建2个窗口?我不懂Qt,用Tkinter很容易搞清楚......

编辑:上面的问题是通过单击系统托盘中的按钮创建一些窗口。正如您在执行下面的代码时所看到的,它可以工作,但是任何时候都只显示一个窗口,例如如果我点击系统托盘图标的上下文菜单两次创建两个窗口。我不知道它来自哪里......

import sys
from PyQt4.QtGui import *


class Note(QMainWindow):
    def __init__(self):
        super(Note,self).__init__()
        self.w=QWidget()
        self.setWindowTitle("Note")
        self.setCentralWidget(self.w)

class main():
    def __init__(self):
        self.app = QApplication(sys.argv)

        self.trayIcon = QSystemTrayIcon(QIcon("J:\\python\\SimpleNotes.ico"), self.app)
        self.menu = QMenu()

        self.newWindow = self.menu.addAction("new Note")
        self.separator = self.menu.addSeparator()
        self.exitAction = self.menu.addAction("Exit")

        self.exitAction.triggered.connect(self.close)
        self.newWindow.triggered.connect(self.newNote)
        self.trayIcon.setContextMenu(self.menu)
        self.trayIcon.show()

        self.app.exec()

    def newNote(self):
        print("Create new note entry has been clicked")
        self.note=Note()
        self.note.show()

    def close(self):
        self.trayIcon.hide()
        self.app.exit()
        print("Exit menu entry has been clicked")

main()

EDIT2: 得到它了!这个问题可以通过这种方式编码来解决:

class main():
    def __init__(self):
        self.notes=[]
        ...

    def newNote(self):
        note=Note()
        note.show()
        self.notes.append(note)

虽然我仍然不知道为什么它现在有效,或者如果删除“self.notes.append(note)”行,甚至不会出现窗口。但是,它有效!

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

from PyQt4.QtGui import *
import sys

class window(QMainWindow):
    def __init__(self):
        super(window, self).__init__()
        self.w=QWidget()
        self.setCentralWidget(self.w)

app=QApplication(sys.argv)
w1 = window()
w1.show()
w2 = window()
w2.show()
app.exec()

您需要显示顶级容器,而不是内部窗口小部件。并且可能希望该窗口小部件显示在主窗口内而不是作为独立窗口显示。

更新后的代码存在的问题是,当您再次点击“添加备注”时,会将成员self.note替换为新窗口。因此,在调用之后的任何地方都不会引用前一个窗口,并将其销毁 如果你想保持多个窗口打开,只要你需要它们就需要处理所有窗口。

警告:我实际上并不知道python,所以天真地使用列表可能不是一个好主意 - 我不知道。

试试这个:

class main():
    def __init__(self):
        self.app = QApplication(sys.argv)
        self.app.setQuitOnLastWindowClosed(False);
        self.notes = []
        ...

    def newNote(self):
        print("Create new note entry has been clicked")
        note=Note()
        note.show()
        self.notes.append(note)

setQuitOnLastWindowClosed部分在您的使用案例中是必要的,否则app.exec会在您关闭所有注释窗口后退出,并且您的应用将在此时退出 - 看起来不像是你想要发生什么。

注意:这不是QMainWindow的常用用法。这是一个“沉重”的类,通常用作“完整”GUI应用程序的唯一主窗口,带有菜单,工具栏,状态栏等。使用简单的QWidget和{{1}对于这个用例,可能有几个按钮听起来更好。实际上,您可能会从QTextEdit派生Note并仅实现上下文菜单。