1、介绍
pyqt5中的交互框有很多种,先介绍我用到的,后续有用到的再慢慢补充
2、文件选择框:QFileDialog
通过以下代码实现:
imgName, imgType = QFileDialog.getOpenFileName(parent=None, caption="打开图片", directory="", filter="*.jpg;;*.png;;All Files(*)")
parameter:
- parent:为父窗体,这里是通过加载ui文件的形式加载的ui,所以设为None
- caption:显然是窗口的title
- directory:表示打开窗口后显示的文件夹路径,"."表示打开和程序同级目录
- filter:表示限定了文件夹路径
return:
- imgName:用户选中的文件的路径
- imgType:文件的后缀名
3、消息框:QMessageBox
reply = QMessageBox.information(self, "标题", "消息正文", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
parameter:
- self:当没有或者通过ui文件加载的ui时,应写为None
- “标题”:标题
- “消息正文”:消息正文
- QMessageBox.Yes | QMessageBox.No:你想要显示的按钮
- QMessageBox.No:默认按钮(即图中蓝色边框选择)
return:
- reply:是你选择的按钮,
reply==QMessageBox.Yes
或者reply==QMessageBox.No
3.1、其他类型的QMessageBox
- QMessageBox.information()
- QMessageBox.warning()
- 还有很多其他的,自行百度
3.2、非主线程使用QMessageBox
在pyqt5中只有MainWindow是主线程,而QMessageBox只能在主线程使用,即不能在新开的线程中使用QMessageBox,否则弹框会卡死。
所以通过QThread来在非主线程进行弹框的触发
参考:
1. PyQt5 在非主线程(GUI线程)中实现弹窗
2. PyQt5 中信号signal 与 槽 slot 的相关知识
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
class Message(QThread):
signal = pyqtSignal()
def __init__(self, Window):
super(Message, self).__init__()
self.window = Window
def run(self):
self.signal.emit()
class MainWindow(QMainWindow):
def __init__(self,parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("MainWindow") # 主界面
self.resize(600, 400)
self.button = QPushButton(self) # 定义按钮
self.button.setText("点击弹出对话框")
self.button.move(50, 50)
# 绑定slot函数
self.button.clicked.connect(self.fun) # 定义按钮触发
# 上面是用按钮->func()->box
# 也可以在你想要触发的地方直接执行self.message.start(),触发弹框
self.message = Message(None)
self.message.signal.connect(self.box) # 一旦message执行start(),就会触发box()函数
def box(self):
QMessageBox.information(None, 'Warning', '未入库对象', QMessageBox.Ok)
self.UnKnowKey=True
def fun(self):
self.message.start() # 通知开始弹窗
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = MainWindow()
demo.show()
sys.exit(app.exec_())