gpt4 book ai didi

python - 需要用 PyQt4 实例化 QWidget

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:17 26 4
gpt4 key购买 nike

此代码有效:

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()

编辑2:知道了!这个问题可以通过这样编码来解决:

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 应用程序的唯一主窗口,带有菜单、工具栏、状态栏等。使用简单的 QWidgetQTextEdit对于这个用例来说,也许几个按钮听起来更好。事实上,您可能可以通过派生 Note 来逃脱惩罚。来自QTextEdit并仅实现一个上下文菜单。

关于python - 需要用 PyQt4 实例化 QWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16733922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com