基本框架

# PyQt5引入的组件其实只需要QtWidgets、QApplication就可以实现最基本的窗体显示
# 还需要引入sys作为窗体应用进程的控制
from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QLineEdit,QPushButton
import sysclass TemplateForm(QWidget):def __init__(self):super().__init__()hlayout=QHBoxLayout()self.setLayout(hlayout)lineEdit=QLineEdit()lineEdit.setText('Hello,world!')button=QPushButton()button.setText('Please press me!')button.clicked.connect(self.close)hlayout.addWidget(lineEdit,1)hlayout.addWidget(button,2)# Press the green button in the gutter to run the script.
if __name__ == '__main__':app=QApplication(sys.argv)form=TemplateForm()form.show()app.exit(app.exec_())

基本组件使用

  • QMainWindow
  • QWidget
from PyQt5.QtCore import Qt
# 设置窗口背景透明
mywin.setAttribute(Qt.WA_TranslucentBackground)
#  隐藏窗口边框
mywin.setWindowFlags(Qt.FramelessWindowHint)
# 设置窗口边框带阴影
from PyQt5.QtWidgets import QGraphicsDropShadowEffect
effect=QGraphicsDropShadowEffect(self)
effect.setBlurRadius(12) # 设置阴影画笔强度
effect.setOffset(0,0)
effect.setColor(Qt.gray)
mywin.setGraphicsEffect(effect)

在隐藏窗体边框后鼠标不能拖动窗体,需要重写鼠标事件,首先为窗体设置一个变量m_Drag判断鼠标左键是否按下。

# 在窗体类里定义m_Drag
def __init__(self):super().__init__()self.m_Drag=False#  重写鼠标事件
"""重写隐藏边框后的鼠标事件,因为隐藏边框后不能移动窗体"""
def mousePressEvent(self, event):if event.button() == Qt.LeftButton:self.m_Drag = True# event.globalPos()是鼠标当前点击位置相对于电脑桌面左上角的坐标# self.pos()是当前窗体相对于电脑桌面左上角的坐标self.m_DragPosition = event.globalPos() - self.pos()# 将拖动时鼠标的光标形状变成小手self.setCursor(QCursor(Qt.OpenHandCursor))def mouseMoveEvent(self, event):# 只有单击鼠标左键才能移动if Qt.LeftButton and self.m_Drag:# move(QPoint()),是将窗体移动到某一点self.move(event.globalPos() - self.m_DragPosition)def mouseReleaseEvent(self, event):self.m_Drag = Falseself.setCursor(QCursor(Qt.ArrowCursor))
  • QPushButton
    按键用得最多的就是“单击事件”:
def myfunc():passbutton=QPushButton()
button.clicked.connect(myfunc)
# 如果自定义函数是带参数的,使用lambda表达式
button.clicked.connect(lambda : myfunc(parm1,parm2...))

然后就是对QPushButton的QSS装饰(QSS代码):

/*QPushButton的正常样式*/
QPushButton{width:100px;height:25px;background-color:#FFFFFF;/*设置圆角*/border:1px solid #00CCCC;border-radius:5px;color:#000000;
}
# 当鼠标悬浮在QPushButton时的样式
QPushButton:hover{background-color:#00CCFF;color:#888888;
}
# 单击QPushButton时的样式
QPushButton:pressed{background-color:red;color:black;
}

第二就是如何使用QPushButton控件做一个圆形的logo,主要还是qss的修饰:

from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QHBoxLayout,QGraphicsDropShadowEffect
from PyQt5.Qt import Qt # 使用Qt里的颜色
import sysqssStyleSheet='''QPushButton {/*限制最小最大尺寸*/min-width: 96px;max-width: 96px;min-height: 96px;max-height: 96px;border-radius: 48px; /*圆形*/border:none;background:white;/* 设置按钮的背景图片 */border-image:url(./backgroundimg2.png);}
'''class MyLogoButtonForm(QWidget):def __init__(self):super(MyLogoButtonForm, self).__init__()self.myButton=QPushButton()hlayout=QHBoxLayout()hlayout.addWidget(self.myButton)self.setLayout(hlayout)# 为按钮周边设置阴影logoShadow=QGraphicsDropShadowEffect(self) # 这里的self是当前按钮的父控件,不一定是selflogoShadow.setBlurRadius(8)logoShadow.setOffset(0,0)logoShadow.setColor(Qt.gray)self.myButton.setGraphicsEffect(logoShadow)self.setStyleSheet(qssStyleSheet)if __name__ == '__main__':app=QApplication(sys.argv)myform=MyLogoButtonForm()myform.show()sys.exit(app.exec_())


第三是将按键设置成那种带小图标的样式:

# 在上述例子中引入QIcon和QPixmap
from PyQt5.QtGui import QIcon,QPixmap # 设置一个图标样式的按钮
# 为按钮准备一个小图标
icon=QIcon()
# 用QPixmap为按键添加图标图片
icon.addPixmap(QPixmap('./searchIcon48.png'),QIcon.Normal,QIcon.Off)
self.myBtn2=QPushButton()
self.myBtn2.setObjectName('searchpushButton')
self.myBtn2.setIcon(icon)
# 还要将按钮文本设为空字符串
self.myBtn2.setText('')

然后按照惯例修饰一下按钮(QSS代码)

QPushButton#searchpushButton{width:60px;
height:25px;
background-color:#FFFFFF;
border:1px solid #00CCCC;
border-radius:5px;
color:#000000;
}
QPushButton#searchpushButton:hover{background-color:#00CCFF;color:#888888;
}

  • QLineEdit
    单行文本输入框我只使用了其获取文本的功能/设置提示文本功能/设置掩码(密码输入)功能,至于还有什么骚操作有待探索。
# 单行文本框获取文本的方法
myLineEdit=QlineEdit()
textstr=myLineEdit.text()
# 设置文本框为掩码模式,输入密码是是黑点
textstr.setEchoMode(QLineEdit.Password)
# 设置提示文本
textstr.setPlaceholderText("你想要的提示文本")
  • QProgressBar—进度条
    进度条的使用是动态的,进度值是在后台不断变化的,这就需要我们在使用时进度条时引入线程,不然界面在进度条动态变化时可能会“假死”。
    首先,来看如何创建进度条:
# 首先来看如何创建进度条,先引入需要的组件
from PyQt5.QtWidgets import QApplication,QWidget,QProgressBar,QHBoxLayout
import sys
class ProgressBarForm(QWidget):def __init__(self):super(ProgressBarForm, self).__init__()self.myprogressbar=QProgressBar()hlayout=QHBoxLayout()hlayout.addWidget(self.myprogressbar)self.setLayout(hlayout)if __name__ =='__main__':app=QApplication(sys.argv)myform=ProgressBarForm()myform.show()myform.setProgressBarValue()sys.exit(app.exec_())

这样的进度条是不会动的,要使进度条的进度值显示动态变化,引入线程:
为了实现目的,我们需要增加三样东西:
1.线程ProgressBarThread,其中使用了Qt的signal-slot机制,在线程中改变进度条的值,再用信号signal绑定回调函数slot,使用信号将进度条的进度值传递给回调函数(通知)。
2.回调函数setProgressBarValue_CallBack,接收信号传递来的进度值,然后更新进度条显示的进度值。
3.控制函数setProgressBarValue,创建线程对象、将线程中的信号signal和回调函数slot绑定起来、启动线程。

from PyQt5.QtWidgets import QApplication,QWidget,QProgressBar,QHBoxLayout
# 引入线程使得进度条值在后台自动变化
from PyQt5.QtCore import QThread,pyqtSignal
import sys
import time # 用于停止线程class ProgressBarThread(QThread):'''线程,用于控制进度条的进度值'''triggerSignal=pyqtSignal(int)def __init__(self):super(ProgressBarThread, self).__init__()def run(self):num=1while num<100:self.triggerSignal.emit(num)time.sleep(1)num+=1class ProgressBarForm(QWidget):def __init__(self):super(ProgressBarForm, self).__init__()self.myProgressBar=QProgressBar()hlayout=QHBoxLayout()hlayout.addWidget(self.myProgressBar)self.setLayout(hlayout)def setProgressBarValue(self):self.myThread=ProgressBarThread()self.myThread.triggerSignal.connect(self.setProgressBarValue_CallBack)self.myThread.start()def setProgressBarValue_CallBack(self,ivalue):self.myProgressBar.setValue(ivalue)if __name__ =='__main__':app=QApplication(sys.argv)myform=ProgressBarForm()myform.show()myform.setProgressBarValue()sys.exit(app.exec_())

第三是来看看进度条如何美化(QSS代码):

qssStyleSheet='''/* 设置进度条的三种样式 */#RedProgressBar {/* 进度值居中 */text-align:center;}#RedProgressBar::chunk {/* 设置进度条里进度值显示的栅栏格子样式 */background-color:#F44336;}#GreenProgressBar {min-height: 12px;max-height: 12px;border-radius: 6px;}#GreenProgressBar::chunk {/* 设置进度条里进度值显示的栅栏格子样式 */background-color:#009688;border-radius: 6px;}#BlueProgressBar {text-align:center;/* 设置进度条边框及其颜色 */border: 2px solid #00CCCC;/* 设置圆角 */border-radius: 5px;background-color:#FFFFFF;}#BlueProgressBar::chunk {/* 设置进度条里进度值显示的栅栏格子样式 */background-color:#00CCCC;width: 5px;margin: 0.5px;}
'''

  • QThread—Qt线程
    在进度条使用例子里,就是我第一次接触QThread,主要思路就是创建一个自己的类继承QThread,然后自定义线程类的run函数即可。
from PyQt5.QtCore import QThread
class MyThread(QThread):def __init__(self):super(MyThread,self).__init__()def run(self):# 自定义的功能函数
  • QTableWidget—QT表格控件
    QTableWidget主要包括:
    水平表头、垂直表头
    表格行、列
    单元格

如何使用表格,主要包括:
先看modifierTableWidget里如何设置表格
再看如何往表格里添加内容,包括添加文本、添加控件
然后是如何删除表格的内容、如何清空表格内容
最后是如何美化表格(qss)

from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QPushButton,\QTableWidget,QAbstractItemView,QHeaderView,QTableWidgetItem
from PyQt5.Qt import Qt
import sysclass MyTableWidget(QWidget):def __init__(self):super(MyTableWidget, self).__init__()hlayout=QHBoxLayout()self.tableWidget=QTableWidget()# 设置表格属性self.modifierTableWidget()# 为表格添加点内容btnStr='Hello,world!'btn=QPushButton(btnStr)btn1=QPushButton(btnStr)# 在表格添加文本textItem=QTableWidgetItem('I am super man!')# self.tableWidget.insertRow(0)  # 增加第一行self.tableWidget.setItem(0,0,textItem)# 在表格添加控件# self.tableWidget.insertRow(1) # 增加第一行self.tableWidget.setCellWidget(1,0,btn) # 在第一行、第一列放置按钮# self.tableWidget.insertRow(2) # 增加第二行self.tableWidget.setCellWidget(2,1,btn1) # 在第二行、第一列放置按钮# 删除表格内容# self.tableWidget.removeCellWidget(1,0) # 删除表格中第二行第一列的内容# self.tableWidget.removeColumn(1) # 删除表格的某一列# self.tableWidget.removeRow(1) # 删除表格的某一行# self.tableWidget.takeItem(1,0) # 这个也是删除某行某列的内容,但好像不起作用# 获取单击按钮所在的表格行位置rowIndex=self.tableWidget.indexAt(btn.pos()).row() # 这里好像返回的都是0,没搞清楚print(rowIndex)# 清空表格内容# self.tableWidget.clear()# self.tableWidget.clearContents()# self.tableWidget.setRowCount(0)hlayout.addWidget(self.tableWidget)self.setLayout(hlayout)self.setStyleSheet(qssStyleSheet)def modifierTableWidget(self):self.tableWidget.setRowCount(5) # 设置行数,设置了行数就不需要用insertRowself.tableWidget.setColumnCount(2) # 设置表格列数self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # 禁止编辑self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) # 整行选中self.tableWidget.horizontalHeader().setVisible(False) # 设置水平表头不可见self.tableWidget.verticalHeader().setVisible(True) # 设置垂直表头可见# self.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch) # 设置行高根据内容伸缩self.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Fixed) # 设置行高固定self.tableWidget.verticalHeader().setDefaultSectionSize(int(self.tableWidget.height() / 7)) # 设置每一行的默认高度self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 设置列根据内容伸缩# self.mywidget.tableWidget.setFrameStyle(QFrame.NoFrame) # 去掉边框self.tableWidget.setShowGrid(False) # 去掉单元格虚线self.tableWidget.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) # 设置滚动条self.tableWidget.setVerticalHeaderLabels(['header1','header2']) # 设置垂直表头内容if __name__ == '__main__':app=QApplication(sys.argv)myform=MyTableWidget()myform.show()sys.exit(app.exec_())

  • QDateEdit/QDateTimeEdit
from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QDateEdit,QDateTimeEdit
from PyQt5.QtCore import QDate,QTime,QDateTime
import sysclass MyDateEditForm(QWidget):def __init__(self):super(MyDateEditForm, self).__init__()hlayout=QHBoxLayout()self.dateEdit=QDateEdit()self.dateTimeEdit=QDateTimeEdit()# 设置日期控件为日历self.dateEdit.setCalendarPopup(True)# 设置日期控件显示为当前时间self.dateEdit.setDate(QDate.currentDate())# 设置时间控件显示的时间格式为“yy-mm-dd"self.dateEdit.setDisplayFormat("yyyy-MM-dd")# 设置日期控件为日历self.dateTimeEdit.setCalendarPopup(True)# 设置日期控件显示为当前时间self.dateTimeEdit.setDate(QDate.currentDate())self.dateTimeEdit.setTime(QTime.currentTime())self.dateTimeEdit.setDateTime(QDateTime.currentDateTime())# 设置时间控件显示的时间格式为“yy-mm-dd"self.dateTimeEdit.setDisplayFormat("yyyy-MM-dd hh:mm:ss")# 获取控件时间的方法time1=self.dateEdit.date()print(time1)time2=self.dateTimeEdit.time().hour()print(time2)hlayout.addWidget(self.dateEdit)hlayout.addWidget(self.dateTimeEdit)self.setLayout(hlayout)if __name__ =='__main__':app=QApplication(sys.argv)myform=MyDateEditForm()myform.show()sys.exit(app.exec_())

结语

好了,懒懒的自己将毕设的东西慢慢整理出来,走出校园,走进职场,只能慢慢努力了,做一个热爱编程的人。
—偷得浮生半日闲,又摘桃花换酒钱!

PyQt5学习例子整理相关推荐

  1. 第二弹:超全Python学习资源整理(进阶系列)

    造一个草原要一株三叶草加一只蜜蜂.一株三叶草,一只蜂,再加一个梦.要是蜜蜂少,光靠梦也行. - 狄金森 "成为编程大牛要一门好语言加一点点天分.一门好语言,一点点天分,再加一份坚持.要是天分 ...

  2. python eval 入门_Python学习笔记整理3之输入输出、python eval函数

    Python学习笔记整理3之输入输出.python eval函数 来源:中文源码网    浏览: 次    日期:2018年9月2日 Python学习笔记整理3之输入输出.python eval函数 ...

  3. Deep Learning(深度学习)学习笔记整理系列之(八)

     Deep Learning(深度学习)学习笔记整理系列之(八) 分类: Deep Learning 机器学习 Linux驱动2013-04-10 11:4257652人阅读评论(25)收藏举报 ...

  4. 一份C++学习资源整理,咬牙切齿地好用。

    多年以后,你已经是一名技术总监,有一个美丽的妻子,两个孩子:你已经拥有了现在的你想都不敢想的一切:那时,你也一定会忘记,今天这篇教程,如同一颗石子,铺就过你前进的路. 下面是我们的老师根据现有资源整理 ...

  5. Deep Learning(深度学习)学习笔记整理(二)

    本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流 [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之: ...

  6. java反射 pdf_java反射学习笔记整理.pdf

    java反射学习笔记整理.pdf 还剩 15页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: Java 反射笔记 ...

  7. Kafka入门篇学习笔记整理

    Kafka入门篇学习笔记整理 Kafka是什么 Kafka的特性 应用场景 Kafka的安装 单机版部署 集群部署环境准备 Kafka 2.x集群部署 Kafka 3.x集群部署 监听器和内外网络 K ...

  8. 学习笔记整理:Photoshop软件应用-图层的应用和渐变工具

    以下内容为个人的学习笔记整理,如有错误,请指出,谢谢~ 一.图层 可以新建图层.复制图层.将图层分组.删除图层.越下面的图层是在最底面的,一层一层往上加,上面的图层会覆盖下面的图层(可以用橡皮擦擦掉) ...

  9. informatica 学习日记整理(转)

    1. INFORMATICA CLIENT的使用 1.1 Repository Manager 的使用 1.1.1 创建Repository. 前提: a. 在ODBC数据源管理器中新建一个数据源连接 ...

最新文章

  1. 向HtmlAgilityPack道歉:解析HTML还是你好用
  2. nova虚拟机打不开console
  3. PyPI又双叒叕发现恶意软件,能盗取信用卡还有后门程序
  4. 笔记-计算机网络基础-无线局域网标准IEEE802
  5. 信号分解:标架、对偶标架、紧标架
  6. oracle 向右去整,使用table表格无端的整体向右偏移一段距离
  7. Recurrent Neural Network[Quasi RNN]
  8. 使用net start mysql命令后出现“MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。”问题的解决办法
  9. 正则表达式应用:实现一个简单的计算器
  10. 女程序员怀孕7个月坚持上班敲代码
  11. Java中转发(Forward)和重定向(Redirect)的区别
  12. linux用户怎么归纳到组,Linux用户和组命令总结
  13. loj10036. 「一本通 2.1 练习 2」Seek the Name, Seek the Fame
  14. 局域网交换机(Lan Switch)
  15. 解决华硕笔记本自带触摸板的二指及三指失效的问题
  16. matlab定义sliced类型,Sliced Variables
  17. 公共数据库介绍~google公共数据
  18. 模糊查询 like 多个条件
  19. 聊一下关于面试的话题,只谈共性,不谈个例,一家之言,仅供求职者参考:)
  20. AI稳定生成图工业链路打造

热门文章

  1. Linux 学习视频完整
  2. vue项目node编译内存溢出(node)
  3. 考取信息安全保障从业人员认证(CISAW)有什么要求?
  4. 【短文】回首过去 / 展望退役
  5. jmeter中添加cookie
  6. 第一关:干掉链表这个小喽啰
  7. python暴力破解zip密码文件
  8. Python学习--多态
  9. python处理大数据量json数据的方法_python-利用json模块处理json数据几个函数总结...
  10. 梅科尔工作室-王宣-鸿蒙笔记4