过程如下:
创建Widget窗体后,先转为py文件,然后新建一个CallMainUI.py文件用来对基本UI界面做修改及添加信号与槽的响应。
在CallMainUI.py文件中设置单击pushButton弹出一个列表对话框:
class MainWin(QMainWindow, Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.pop_win)
def pop_win(self):
lst_widget = QListWidget()
lst_widget.addItems(['item1', 'item2', 'item3'])
lst_widget.show()
运行后,点击按钮,子窗口闪退了。为什么呢?
原因分析:
对话框分为两种:
模态对话框与非模态对话框
模态对话框:在弹出模态窗口时会锁定整个程序,使之处于等待状态,直到用户关闭该对话框。这时往往需要对话框的返回值进行接下来的操作。如确认对话框,需要点击是或否关闭它。
非模态对话框,当非模态对话框被打开时,用户可以和该对话框进行交互,也可以选择同应用程序的其他窗口交互。如查找框。
显示窗口的2个函数:
show() 显示一个非模态对话框,在调用弹出窗口之后,调用即刻返回给调用函数,继续下面的操作。函数执行完后,弹出窗口就被释放了。
需求:在主
窗口
中点击【打开】按钮后,
弹出
一个
子
窗口
,同
时
按钮上的文字变成【关闭】,再次点击即可关闭
子
窗口
!
分析:其实
弹出
子
窗口
并不难实现,关键是同一个按钮实现打开与关闭的功能,这个需要注意实现的方式以及一些细节,需要用到lambda表达式,具体步骤如下:
1、首先新建一个项目,创建一个空
窗口
文件,如下图1所示,然后鼠标右键点击项目,选择添加新文件,选择C++ Class类型,然后选择基于QWid...
问题1:通过点击Button打开新
窗口
后,如何实现不关闭新
窗口
的情况下再点击Button
时
不会新建
窗口
,而是显示先前打开的
窗口
?(以前用tkinter
时
遇到这个问题,是使用一个boolean值来做开关,如果对象已创建,就不新建,否则新建,然后关闭
窗口
时
在控制该boolean,该
方法
可行但是比较麻烦)
分析:有两种
方法
:
1.新建
窗口
时
使用exec_()函数(显示一个模式对话框,并且锁住程序直到...
pyqt
在
窗口
跳转的
时
候会
闪退
:
原因是没有把QMainWindow()放到主进程的self中。如果不加self,则没有app = QApplication(sys.argv)支持,无法循环
窗口
。看到的
闪退
实则是开启一次
窗口
后退出。
解决
办法:
给
窗口
加上self,让其支持循环。
在使用
pyqt
5
时
,程序运行
时
间过长可能会造成界面假死的情况,为了
解决
这个问题,可以采用多线程。将程序放到
子
线程中运行。
这里
pyqt
5
多线程用的
方法
是继承Qthead类,然后重写run()函数实现。
# 多线程的实现
class MyThread(QThread):
_signal =
pyqt
Signal(object) # 自定义信号,用于传递数据等
def __init__(self):
super().__init__()
PYQT
5
点击菜单栏
弹出
新
窗口
,
解决
窗口
闪退
的问题
需要通过self实例化为全局变量,不加self的话,一运行就会被收回,所以无法显示
def rabbit_talk(self):
from asrInterface import Ui_Dialog
'''要加self'''
self.Dialog = QMainWindow()
Ui_Dialog().setupUi(self.Dialog)