专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

PyQt6如何创建多窗口

  在之前的教程中,我们已经介绍了如何打开对话框窗口。这些特殊的窗口(默认情况下)抓住用户的焦点,并运行自己的事件循环,有效地阻止了应用程序其余部分的执行。
  然而,您经常希望在不中断主窗口的情况下在应用程序中打开第二个窗口例如,显示一些长时间运行的进程的输出,或者显示图形或其他可视化。或者,您可能希望创建一个应用程序,允许您在各自的窗口中同时处理多个文档。
  打开新窗口相对简单,但有几件事要记住,以确保它们正常工作。在本教程中,我们将逐步了解如何创建一个新窗口,以及如何根据需要显示和隐藏外部窗口。创建一个新窗口
  在Qt中,任何没有父组件的小部件都是窗口。这意味着,要显示一个新窗口,您只需要创建一个小部件的新实例。这可以是任何小部件类型(严格来说是QWidget的任何子类),如果您愿意,还可以包括另一个QMainWindow。
  QMainWindow实例的数量没有限制。如果你在第二个窗口上需要工具栏或菜单,你将不得不使用QMainWindow来实现这一点。然而,这可能会让用户感到困惑,所以要确保这是必要的。
  与主窗口一样,创建一个窗口是不够的,还必须显示它。fromPyQt6。QtWidgetsimportQApplication,QMainWindow,QPushButton,QLabel,QVBoxLayout,QWidgetimportsysclassAnotherWindow(QWidget):ThiswindowisaQWidget。Ifithasnoparent,itwillappearasafreefloatingwindowaswewant。definit(self):super()。init()layoutQVBoxLayout()self。labelQLabel(AnotherWindow)layout。addWidget(self。label)self。setLayout(layout)classMainWindow(QMainWindow):definit(self):super()。init()self。buttonQPushButton(PushforWindow)self。button。clicked。connect(self。shownewwindow)self。setCentralWidget(self。button)defshownewwindow(self,checked):wAnotherWindow()w。show()appQApplication(sys。argv)wMainWindow()w。show()app。exec()
  如果运行这个程序,您将看到主窗口。单击按钮可能会显示第二个窗口,但如果您看到它,它只会在几分之一秒内可见。这是为什么呢?defshownewwindow(self,checked):wAnotherWindow()w。show()
  在这个方法中,我们创建了窗口(小部件)对象,将其存储在变量w中并显示出来。然而,一旦我们离开这个方法,我们就不再有对w变量的引用(它是一个局部变量),所以它将被清除窗口也将被销毁。为了解决这个问题,我们需要在某个地方保留一个对窗口的引用,例如在self对象上。defshownewwindow(self,checked):self。wAnotherWindow()self。w。show()
  现在,当您单击按钮以显示新窗口时,它将持续存在。
  但是,如果再次单击按钮会发生什么?窗口将被重新创建!这个新窗口将取代自我中的旧窗口。self。w变量,因为现在没有对它的引用前一个窗口将被销毁。
  如果您将窗口定义更改为每次创建标签时在标签中显示一个随机数,就可以看到这一点。fromrandomimportrandintclassAnotherWindow(QWidget):ThiswindowisaQWidget。Ifithasnoparent,itwillappearasafreefloatingwindowaswewant。definit(self):super()。init()layoutQVBoxLayout()self。labelQLabel(AnotherWindowdrandint(0,100))layout。addWidget(self。label)self。setLayout(layout)
  init代码块只在创建窗口时运行。如果您继续单击按钮,数字将改变,显示窗口正在重新创建。
  一种解决方案是在创建窗口之前简单地检查窗口是否已经被创建。下面的示例演示了这一点。fromPyQt6。QtWidgetsimportQApplication,QMainWindow,QPushButton,QLabel,QVBoxLayout,QWidgetimportsysfromrandomimportrandintclassAnotherWindow(QWidget):ThiswindowisaQWidget。Ifithasnoparent,itwillappearasafreefloatingwindowaswewant。definit(self):super()。init()layoutQVBoxLayout()self。labelQLabel(AnotherWindowdrandint(0,100))layout。addWidget(self。label)self。setLayout(layout)classMainWindow(QMainWindow):definit(self):super()。init()self。wNoneNoexternalwindowyet。self。buttonQPushButton(PushforWindow)self。button。clicked。connect(self。shownewwindow)self。setCentralWidget(self。button)defshownewwindow(self,checked):ifself。wisNone:self。wAnotherWindow()self。w。show()appQApplication(sys。argv)wMainWindow()w。show()app。exec()
  使用按钮,您可以弹出窗口,并使用窗口控件关闭它。如果再次单击该按钮,将重新显示相同的窗口。
  这种方法适用于临时创建的窗口例如,如果您想弹出一个窗口来显示特定的图形或日志输出。然而,对于许多应用程序,您都有许多标准窗口,您希望能够按需显示隐藏它们。
  在下一部分中,我们将看看如何使用这些类型的窗口。切换窗口
  通常,您需要使用工具栏或菜单上的操作来切换窗口的显示。正如我们前面看到的,如果没有保留对窗口的引用,它将被丢弃(并关闭)。我们可以使用这种行为来关闭一个窗口,用下面的代码替换前面示例中的shownewwindow方法defshownewwindow(self,checked):ifself。wisNone:self。wAnotherWindow()self。w。show()else:self。wNoneDiscardreference,closewindow。
  通过设置self。w为None,则对窗口的引用将丢失,并且窗口将关闭。
  如果我们将它设置为任何其他值None,窗口仍然会关闭,但是Ifself。wNone测试将不会在下次单击按钮时通过,因此我们将无法重新创建窗口。
  只有当您没有在其他地方保留对该窗口的引用时,这才有效。为了确保窗口无论如何都会关闭,您可能希望显式地对其调用。close()。完整示例如下所示。fromPyQt6。QtWidgetsimportQApplication,QMainWindow,QPushButton,QLabel,QVBoxLayout,QWidgetimportsysfromrandomimportrandintclassAnotherWindow(QWidget):ThiswindowisaQWidget。Ifithasnoparent,itwillappearasafreefloatingwindowaswewant。definit(self):super()。init()layoutQVBoxLayout()self。labelQLabel(AnotherWindowdrandint(0,100))layout。addWidget(self。label)self。setLayout(layout)classMainWindow(QMainWindow):definit(self):super()。init()self。wNoneNoexternalwindowyet。self。buttonQPushButton(PushforWindow)self。button。clicked。connect(self。shownewwindow)self。setCentralWidget(self。button)defshownewwindow(self,checked):ifself。wisNone:self。wAnotherWindow()self。w。show()else:self。w。close()Closewindow。self。wNoneDiscardreference。appQApplication(sys。argv)wMainWindow()w。show()app。exec()持续的窗户
  到目前为止,我们已经了解了如何按需创建新窗口。但是,有时您有许多标准应用程序窗口。在这种情况下,与其在想要显示窗口时创建窗口,不如在启动时创建窗口,然后在需要时使用。show()显示它们,这样做通常更有意义。
  在下面的例子中,我们在主窗口的init块中创建了外部窗口,然后我们的shownewwindow方法简单地调用self。w。show()来显示它。fromPyQt6。QtWidgetsimportQApplication,QMainWindow,QPushButton,QLabel,QVBoxLayout,QWidgetimportsysfromrandomimportrandintclassAnotherWindow(QWidget):ThiswindowisaQWidget。Ifithasnoparent,itwillappearasafreefloatingwindowaswewant。definit(self):super()。init()layoutQVBoxLayout()self。labelQLabel(AnotherWindowdrandint(0,100))layout。addWidget(self。label)self。setLayout(layout)classMainWindow(QMainWindow):definit(self):super()。init()self。wAnotherWindow()self。buttonQPushButton(PushforWindow)self。button。clicked。connect(self。shownewwindow)self。setCentralWidget(self。button)defshownewwindow(self,checked):self。w。show()appQApplication(sys。argv)wMainWindow()w。show()app。exec()
  如果运行此命令,单击该按钮将显示与以前一样的窗口。但是,请注意,窗口只创建一次,在已经可见的窗口上调用。show()没有任何效果。显示和隐藏持久窗口
  一旦创建了持久窗口,就可以显示和隐藏它,而无需重新创建它。一旦隐藏,窗口仍然存在,但将不可见,并接受鼠标其他输入。但是,您可以继续调用窗口上的方法并更新它的状态包括更改它的外观。一旦重新显示,任何更改都将可见。
  下面我们更新主窗口,创建togglewindow方法,使用。isVisible()检查当前窗口是否可见。如果它不可见,则使用。show()显示,如果它已经可见,则使用。hide()隐藏它。classMainWindow(QMainWindow):definit(self):super()。init()self。wAnotherWindow()self。buttonQPushButton(PushforWindow)self。button。clicked。connect(self。togglewindow)self。setCentralWidget(self。button)deftogglewindow(self,checked):ifself。w。isVisible():self。w。hide()else:self。w。show()
  这个持久窗口和切换显示隐藏状态的完整工作示例如下所示。fromPyQt6。QtWidgetsimportQApplication,QMainWindow,QPushButton,QLabel,QVBoxLayout,QWidgetimportsysfromrandomimportrandintclassAnotherWindow(QWidget):ThiswindowisaQWidget。Ifithasnoparent,itwillappearasafreefloatingwindowaswewant。definit(self):super()。init()layoutQVBoxLayout()self。labelQLabel(AnotherWindowdrandint(0,100))layout。addWidget(self。label)self。setLayout(layout)classMainWindow(QMainWindow):definit(self):super()。init()self。wAnotherWindow()self。buttonQPushButton(PushforWindow)self。button。clicked。connect(self。togglewindow)self。setCentralWidget(self。button)deftogglewindow(self,checked):ifself。w。isVisible():self。w。hide()else:self。w。show()appQApplication(sys。argv)wMainWindow()w。show()app。exec()
  再次注意,窗口只创建了一次每次窗口重新显示时,窗口的init块不会重新运行(因此标签中的数字不会改变)。多重窗口
  您可以使用相同的原则来创建多个窗口只要保持对窗口的引用,事情就会按预期工作。最简单的方法是创建一个单独的方法来切换每个窗口的显示。importsysfromrandomimportrandintfromPyQt6。QtWidgetsimport(QApplication,QLabel,QMainWindow,QPushButton,QVBoxLayout,QWidget,)classAnotherWindow(QWidget):ThiswindowisaQWidget。Ifithasnoparent,itwillappearasafreefloatingwindow。definit(self):super()。init()layoutQVBoxLayout()self。labelQLabel(AnotherWindowdrandint(0,100))layout。addWidget(self。label)self。setLayout(layout)classMainWindow(QMainWindow):definit(self):super()。init()self。window1AnotherWindow()self。window2AnotherWindow()lQVBoxLayout()button1QPushButton(PushforWindow1)button1。clicked。connect(self。togglewindow1)l。addWidget(button1)button2QPushButton(PushforWindow2)button2。clicked。connect(self。togglewindow2)l。addWidget(button2)wQWidget()w。setLayout(l)self。setCentralWidget(w)deftogglewindow1(self,checked):ifself。window1。isVisible():self。window1。hide()else:self。window1。show()deftogglewindow2(self,checked):ifself。window2。isVisible():self。window2。hide()else:self。window2。show()appQApplication(sys。argv)wMainWindow()w。show()app。exec()
  但是,您也可以创建一个通用方法来处理所有窗口的切换。下面的示例演示了如何使用lambda函数拦截来自每个按钮的信号并通过适当的窗口。importsysfromrandomimportrandintfromPyQt6。QtWidgetsimport(QApplication,QLabel,QMainWindow,QPushButton,QVBoxLayout,QWidget,)classAnotherWindow(QWidget):ThiswindowisaQWidget。Ifithasnoparent,itwillappearasafreefloatingwindow。definit(self):super()。init()layoutQVBoxLayout()self。labelQLabel(AnotherWindowdrandint(0,100))layout。addWidget(self。label)self。setLayout(layout)classMainWindow(QMainWindow):definit(self):super()。init()self。window1AnotherWindow()self。window2AnotherWindow()lQVBoxLayout()button1QPushButton(PushforWindow1)button1。clicked。connect(lambdachecked:self。togglewindow(self。window1))l。addWidget(button1)button2QPushButton(PushforWindow2)button2。clicked。connect(lambdachecked:self。togglewindow(self。window2))l。addWidget(button2)wQWidget()w。setLayout(l)self。setCentralWidget(w)deftogglewindow(self,window):ifwindow。isVisible():window。hide()else:window。show()appQApplication(sys。argv)wMainWindow()w。show()app。exec()
  另外说明一下上述lambda表达式,以免有小伙伴看不懂,lambda有两种形式,简单点的如这种xlambdaa:a10print(x(5))
  我相信这种很多小伙伴不懂也能猜出来,在表达式中a作为参数传入
  语法规则:lambda参数:表达式,执行表达式并返回结果,当前也支持多个参数,这里不再举例。
  另一种形式为:defmyfunc(n):returnlambdaa:anmydoublermyfunc(2)print(mydoubler(11))
  输出结果是112。button1。clicked。connect(lambdachecked:self。togglewindow(self。window1))deftogglewindow(self,window):ifwindow。isVisible():window。hide()else:window。show()
  这个代码参数checked并没有使用到

又一次的衣冠南渡,唐朝经济重心南移的原因是什么?如果您喜欢这篇作品,欢迎点击右上方关注。感谢您的鼓励与支持,希望能给您带来舒适的阅读体验。唐朝是我国历史上最繁荣昌盛的时期之一,是我国经济大发展的一个时期,唐朝的繁荣在我国历史上留知乎鼻祖Quora开放聊天机器人Poe,或可以向人类提问用户可以向Poe提出问题,Poe从多种AI聊天机器人处获取答案,包括ChatGPT以及Anthropic等公司开发的机器人。未来,它有可能反过来向人类提问,更好地理解或帮助解决用户烟瘾,酒瘾,色瘾哪个伤害更大呢?为了长寿,中年男性应戒哪种?长命是很多人都要想完成的一件事。通常来说,女性要比男性朋友更加长命一点,人均寿命高了5岁左右。很多人都是会说,女士便是比男士寿长,客观事实的状况果真如此吗?是否会和男士的一些习惯养炎黄子孙一词中,为何炎帝会在黄帝之前?炎帝黄帝今天的中国人自称炎黄子孙,但是大家有没有感到过奇怪,炎黄,炎黄,炎帝凭什么排在黄帝前面?炎帝作为黄帝的手下败将,地位为什么那么高呢?难道上古社会真的那么高风亮节?黄帝打败了黄帝内经隐藏的补肾原理?运动补肾吗?吃火锅补肾是为什么?平时一说气色不好,很容易想到,是不是肾虚了!该补肾了。补肾是怎么回事?用古中医的思维来说说。人们去看中医时候,常听医生说,气血差,要补肾气,我们吃的那些补品真的能补进身体吗?是可以财富守攻传如何在市场波动中求正解?视频加载中本期看点1。面对市场波动,如何重新调整资产配置方案?2。建行私人银行如何帮助和陪伴客户应对市场波动?先讲一个真实的小故事有一个年轻客户,是金融投资的新人。2020年资本市皇家马德里夺得2022摩洛哥世俱杯冠军在11日进行的2022摩洛哥世俱杯决赛中,上赛季欧冠冠军皇家马德里以53击败新科亚洲冠军利雅得新月,队史第五次夺得世俱杯冠军。比赛第13分钟,本泽马禁区前送出直传,维尼修斯插上推射老天爷非让我把日子过成段子在高铁上我经历了4。3级地震这是发生在昨天的事,今天想起来,觉得有些神奇,整个过程如同一部电影。不是灾难片,更不是恐怖片,而是喜剧片。从头到尾,充满了喜感。前天在深圳出差,活动结束后,要到浙江金华,高铁需中转潍坊青州复兴少年宫点亮多彩少年梦太阳出来了,叶子上的卵孵出了一条毛毛虫,这是一条好饿好饿的毛毛虫。天呐!它真的好饿好饿呀,小朋友们,你们能猜到它都吃了些什么吗?近日,潍坊青州市何官镇新时代文明实践所,在乡村复兴少286山西赵城张瑞玑的传奇一生,给卢永祥铸跪像,为民请命上书李成立据史料纪录张瑞玑像。张瑞玑(18721928),字衡玉,山西赵城(今属山西洪洞)人,1903中进士,1906年后,他曾在陕西韩城兴平临潼长安等县任知县,所到之地,均有政声。张三种不同续航江南U2预售5。88万起近日,江南汽车官方透露,旗下新车江南U2正式开启预售,预售价为5。88万9。98万,新车是江南汽车JSmart1。0纯电平台打造的首款车型,将推出6款车型,续航方面分为三个版本,分
今日NBA战报勇士骑士热火独行侠尼克斯老鹰出战我的生活也是头条鹈鹕客场110比123不敌魔术,遭遇三连败。鹈鹕最近状态不佳,客场面对东部弱旅活塞队,前三节还能保持领先,第四节鹈鹕突然哑火,被魔术打一个19比35无奈吞下失利的苦最近,玉兔二号和嫦娥四号着陆器自主唤醒,谈我国为什么要探月?2023年1月15日,16日,我国玉兔二号月球车和嫦娥四号着陆器分别自主唤醒,迎来第51个月昼工作期。玉兔二号行驶轨迹(国家航天局供图)目前,玉兔二号已经工作超过4年,累计行驶近1欧文481164末节21分篮网擒爵士终结4连败!NBA常规赛1月21日继续进行,最终,篮网以117106战胜爵士,篮网终结了4连败。首节开始,双方打成55后爵士开始疯狂打铁失误,欧文和克拉克斯顿合力打出一波142拉开分差!克拉克卢感觉转折点要来了小卡ampampamp乔治都能上场让我们打出高水准直播吧1月21日讯在今天结束的一场NBA常规赛中,快船131126战胜了马刺。在赛后采访环节,泰伦卢被问及了本场胜利是否会是快船队的转折点,对此他这样说道我今天早上就感觉到转折点要国外权威媒体点评今日快船队与马刺队比赛1月21日,国外权威媒体TheAtheltic对今日2连败洛杉矶快船与刚刚结束连败的圣安东尼奥马刺队比赛作出点评。总体点评波波维奇惊出莱昂纳德一身冷汗,直到最后的第四节还剩2分钟时少了一套首发还能赢!这就是冠军球队啊勇士最近的赛程不可谓不艰难,一周两组背靠背,而且全部都是客场作战,奔波疲惫,这对于勇士来说是个巨大的挑战,在昨天加时赛惜败给凯尔特人之后,今天勇士去到了他们熟悉的克利夫兰。比赛开始欧文复出爆砍48116西蒙斯拉胯!篮网末节发力战胜爵士终结连败头条创作挑战赛NBA常规赛爵士主场迎战篮网,此役篮网欧文复出,杜兰特因伤继续缺战,篮网在杜兰特受伤后目前已经是四连败,排名有进一步下滑的风险。爵士则以近日5战4胜的成绩目前暂时排在一拍即合!猛龙步行者交易方案,特纳欲远赴多伦多驰援西亚卡姆据NBA著名记者Shams报道,特纳已经拒绝步行者提出的续约合同,他被交易走基本已经成为定局。猛龙队最近也是交易市场上的非常活跃的球队,一直在寻找一名优秀的内线球员。因此,两队一拍马奎尔球队的替补也同样重要本赛季我们的赛程过于密集马奎尔近期接受了媒体采访,谈到了自己缺少出场时间的问题。我认为从整个赛季来看,替补球员也非常重要。他们在上场之后可能会打进一些关键球,对比赛产生很大的影响,所以我们需要认识到,这是郎平复出悬念揭晓!有望接手土耳其豪门球队,不负球迷期待郎平是中国女排历史上举足轻重的功勋人物。自从2021年东京奥运会之后,郎平也是卸任了女排教练岗位。东京奥运会的惨败,郎平也是背负了很大的压力。失败的主要原因还是包括朱婷等核心球员的飞离地球最远的五大探测器现状如何?自1972年先驱者10号探测器发射以来,目前已经有5艘飞船朝太阳系外进发,它们是先驱者10号11号旅行者1号2号和新视野号。这些探测器目前都已经完成了各自最初的使命,但它们并未偃旗
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网