1.信号与槽
控件触发后,直接发射信号,信号可以发射到其他控件上或者不连接其他控件。信号必须和槽函数绑定,槽函数用来实现具体的功能
信号 比如说clicked() pressed()等等,代表一个动作
手动连接信号与槽的方法:
self.connect(widgets, SIGNAL('signal_name'), func)
# func为自定义的槽函数 widgets参数是发出信号的控件
self.connect(widgets, SIGNAL('signal_name'), instance.methodname)
# instance.methodname是预定义的槽函数
self.connect(widgets, SIGNAL('signal_name'), instance, SLOT('slotSignature'))
使用setup()函数中的QtCore.QMetaObject.connectSlotsByName(MainWindow)连接信号与槽
(1) 在eric中给部件添加自定义的槽函数 (第9集)
在ui文件上右键选择如图,在弹出来的窗口中选择具体的控件以及信号
(2)UI文件 -> 转为py文件 -> 对特定控件的槽函数进行编写
2. Label, Text Browser, Line Edit控件
Line Edit控件用于单行文本输入,显示
Text Browser用于多行
实现点击buttton_8 ,将Line Edit输入的字符串添加到Text Browser. 可以在button_8的槽函数中:
str = self.lineEdit.text
self.textBrowser.append(str)
textBrowser方法:
self.textBrowser.toPlainText() #文本框的纯文本内容
3. radiobutton , groupbox控件
前者是点选按钮,后者用于将多个单选按钮集中在一个组里,一个组的单选按钮互斥(只能选中一个),不同组的单选按钮不互斥
# 获取radionButton状态
self.radioButton.isChecked() # 选中返回真 反之返回假
# 设置状态
self.radioButton.setChecked(True) # 将radioButton选中
4. Dail(旋转式按钮控件),LCD Number控件,slider滑块控件
Dail也是一种按钮,所以也有相应的信号和槽函数,常用如下函数作为信号
即on_dial_valueChanged(int)
函数
这个是它的槽函数,注意参数有个value
@pyqtSlot(int)
def on_dial_valueChanged(self, value):
print (value) # value值范围是0-99
# 这是lcdNumber的方法
self.lcdNumber.display(value)
slider滑块控件基本一样
5. 弹出窗口 QMessageBox类(继承自PyQt5.QtWidgets)
参考这两篇文章
https://blog.csdn.net/jia666666/article/details/81540785
https://blog.csdn.net/zhulove86/article/details/52524735
这几个窗口的返回值是Button. 取决于你传入的Button参数。
点击不同的按钮会返回不同的值
(1)information窗体,弹出一个提示信息,比如“登陆成功!”。在某个按钮的槽函数中,假设信号为clicked()
@pyqtSlot()
# 提示信息框
# 假设已经from PyQt5.QtWidgets import QMessageBox
def on_pushButton_3_clicked(self):
"""
Slot documentation goes here.
"""
result = QMessageBox.infomation(self, '提示', '内容', QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)
# QMessageBox.Yes|QMessageBox.No会产生yes和no两个按钮,第五个参数为默认选中按钮
if result == QMessageBox.Yse:
....
else :
....
# QMessageBox.information函数执行后会弹出一个窗口,同时返回一个值1024
# self代表MainWindown类的一个实例化对象,即选择在哪个窗口弹出窗口
(2)question窗体
类似
result = QMessageBox.question(self, '窗口名', '询问内容', QMessageBox.Yes|QMessageBox.No)
点击yes 和no 函数返回的值不同
6.标准输入对话框,QInputDialog控件类
https://zhuanlan.zhihu.com/p/29101077
一样的,首先要form PyQt5.QtWidgets import QInputDialog
(1)QInputDialog.getText 输入字符串
@pyqtSlot()
def on_pushButton_7_clicked(self):
"""
Slot documentation goes here.
"""
result= QInputDialog.getText(self, '输入', '请输入信息')
print(result)
# 假设输入 哈哈哈
# result == ('哈哈哈', True)
(2)QInputDialog.getInt 输入整数
@pyqtSlot()
def on_pushButton_8_clicked(self):
"""
Slot documentation goes here.
"""
result = QInputDialog.getInt(self, '输入整数', '输入一个整数', 30, 0, 100)
# 30为默认值 0为最小值 100为最大值 必须有这几个参数
(3)QInputDialog.getItem 下拉框
@pyqtSlot()
def on_pushButton_9_clicked(self):
"""
Slot documentation goes here.
"""
sex = ['男', '女'] # 先定义列表 作为待传参数
result = QInputDialog.getItem(self, '下拉框', '选择性别', sex)
# result[0]为 '男' 或 '女' result[1]为 'True' 或 'False'
7.多个窗口(18集)
注:所说的主窗口文件是指带槽函数的那个文件,不是最基本的由UI文件转成的py文件 其他文件比如充值窗口文件同理
假设在主窗口点击充值按钮,弹出一个充值窗口。只需再新建一个dialog类型的ui文件,布局好后,
该ui文件的带槽函数的代码如下
# -*- coding: utf-8 -*-
"""
Module implementing Dialog.
"""
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox, QInputDialog, QDialog
from Ui_info import Ui_Dialog # Ui_Dialog是充值窗口的ui文件里的类,负责控件布局
# 全局变量
charge_money = 0.0
temp_charge_money = 0.0
class Dialog(QDialog, Ui_Dialog):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor
@param parent reference to the parent widget
@type QWidget
"""
super(Dialog, self).__init__(parent)
self.setupUi(self)
# 修改充值金额
@pyqtSlot()
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
global temp_charge_money
temp_charge_money, ok = QInputDialog.getDouble(self, '充值', '自定义充值金额', 5.0, 1.0, 100.0)
self.lcdNumber_2.display(temp_charge_money)
# 确定
@pyqtSlot()
def on_pushButton_2_clicked(self):
"""
Slot documentation goes here.
"""
# 点击确定会让修改金额生效
global charge_money, temp_charge_money
charge_money = temp_charge_money
print(charge_money)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
ui =Dialog()
ui.show()
sys.exit(app.exec_())
在充值按钮的槽函数内进行 充值窗口类的实例化,并运行。当然,在主窗口文件中要先导入充值窗口文件import info
才能调用Dialog类
# 充值
@pyqtSlot()
def on_pushButton_3_clicked(self):
"""
Slot documentation goes here.
"""
my_info = info.Dialog()
my_info.exec_()
8. 显示图片 见视频教程
9. 启动界面 21集 QSplashScreen类
在主窗口文件中
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
# 弹出初始化界面 QSplashScreen继承自QWidgets, QPixmap继承自QtGui ':/images/imags/splashscreen.PNG'是复制过来的路径
splash = QSplashScreen(QPixmap(':/images/imags/splashscreen.PNG'))
splash.show()
# 显示提示文字
splash.showMessage('正在初始化....')
time.sleep(0.1)
splash.showMessage('加在字体....')
time.sleep(0.1)
splash.showMessage('加在模块....')
time.sleep(0.1)
# 避免初始化过程中卡死
app.processEvents()
# 运行主窗体
ui =MainWindow()
ui.show()
# 运行完毕就结束启动界面
splash.close()
sys.exit(app.exec_())
10. 菜单栏 为每个选项添加槽函数
选项的名字是 actionname
它的信号一般是trigger
9文件操作
(1)打开文件,输出内容到多行文本框
@pyqtSlot()
def on_actionopen_triggered(self):
"""
Slot documentation goes here.
"""
# QFileDialog继承自QWidgets getOpenFileName返回元组,第一个元素是打开的文件的路径
file_path = QFileDialog.getOpenFileName(self,'打开文件', '/')
file_object = open(file_path[0])
str = file_object.read()
self.textBrowser.append(str)
(2)将多行文本框的内容保存,即写入一个新文件中
# 保存
@pyqtSlot()
def on_actionsave_triggered(self):
"""
Slot documentation goes here.
"""
my_data = self.textBrowser.toPlainText()
file_path = QFileDialog.getSaveFileName(self,'保存', '/')
file_object = open(file_path, 'a+')
file_object.write(my_data)
file_object.close()
(4)
一个最简单的登录实现
@pyqtSlot()
# 输入信息后 按钮点击 登录 。此为pushbutton的槽函数
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
user_name = self.lineEdit.text()
pass_word = self.lineEdit_2.text()
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost", "root", "123456", "test")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
sql = 'SELECT password FROM user WHERE username="%s"'%(user_name)
# 使用 execute() 方法执行 SQL 查询
cursor.execute(sql)
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
# 判断密码对不对
if data == None:
print('用户名错误')
elif pass_word == data[0]:
print('登陆成功')
else:
print('密码错误')
# 关闭数据库连接
db.close()