[英]Need held with instancing a QWidget with PyQt4
此代码有效:
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可以很容易地发现...
编辑:上面的问题旨在通过单击系统托盘中的按钮来创建一些窗口。 正如您在执行下面的代码时所看到的那样,它可以工作,但是在任何时候都只显示一个窗口,例如,如果我两次单击systray图标的上下文菜单来创建两个窗口。 我不知道它来自哪里...
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)”行,甚至没有窗口出现。 但是,它有效!
尝试这样的事情:
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
与QTextEdit
一起使用,也许还可以听到几个按钮的声音对于这个用例来说更好。 实际上,您可能会从QTextEdit
导出Note
并仅实现上下文菜单而逃脱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.