窗体设计html
qtdesigner经过组建拖拽作界面很简单,网上教程也不少,可是样式设计的进阶教程倒是很难找到。想要作一个相似QQ登陆界面并不简单。设计登陆界面以下:python
主要的困难在于须要去掉窗口的标题栏,没有标题栏就不能关闭和最小化,也不能进行窗口的拖拽,因此须要重写最小化和关闭按键,以及实现拖拽,代码入下:编程
self.close.clicked.connect(QCoreApplication.instance().quit)
self.bmin.clicked.connect(self.showMinimized)
关闭按键和最小化按键响应事件设置ide
# 重写三个方法使窗口支持拖动,上面参数window就是拖动对象 def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.m_drag = True self.m_DragPosition = event.globalPos() - self.pos() event.accept() self.setCursor(QCursor(Qt.OpenHandCursor)) def mouseMoveEvent(self, QMouseEvent): if Qt.LeftButton and self.m_drag: self.move(QMouseEvent.globalPos() - self.m_DragPosition) QMouseEvent.accept() def mouseReleaseEvent(self, QMouseEvent): self.m_drag = False self.setCursor(QCursor(Qt.ArrowCursor))
想要让界面更加美化一点须要用到QSS(样式表),很遗憾关于样式表教程并很少,QSS相似网页设计CSS(就是来源于吧==)函数
以关闭按钮举例:实现按钮,鼠标选中和鼠标按下三种不一样状况的贴图优化
图片素材:对应三种按键状况ui
"QPushButton{background-image:url(./qrc/btn_close_mormal.png);width:39px;height:18px;padding-top:0px;border:0px;}" "QPushButton:hover{background-image:url(./qrc/btn_close_highligt.png)}" "QPushButton:pressed{background-image:url(./qrc/btn_close_down.png)}"
分别定义三种情形的QSS样式表,在代码中用setStyleSheet("qss")函数进行设置。url
滑块与微调框spa
设计用户选择题目数量的部分,我选择了滑块组件,能够很方便的限制题目范围在10-30之内,可是滑块并不能显示数字,因而我加了spinBox(微调框)来选择题目数和显示数字命令行
如何把滑块与微调框的值绑定起来,百度后知道是须要分别写两个组建的valueChanged的槽函数,也没找到源码实例,就只有本身写了。
self.nub_horizontalSlider.valueChanged.connect(self.spin_change) #类中加入事件 self.nub_spinBox.valueChanged.connect(self.slider_change) ''' -------------------------------------------------------------------------- ''' def spin_change(self): #绑定滑块与控件,使其中一个改变另外一个也改变 self.nub_spinBox.setValue(self.nub_horizontalSlider.value()) def slider_change(self): self.nub_horizontalSlider.setValue(self.nub_spinBox.value())
倒计时
在作题过程当中,须要加入考试倒计时,当倒计时结束中止答题。倒计时我经过数码管组建来作,可是因为时间匆忙,并无达到我想要的样子。
倒计时要用到QTimer模块,经过一个定时器得到时钟频率,就和硬件实训的定时器差很少。
from PyQt5.QtCore import QTimer #窗口类中加入定时器 self.timer = QTimer(self) self.timer.timeout.connect(self.timer_oprate) self.timer.start(1000) #槽函数,计数-1,当为0时关闭窗口 def timer_oprate(self): self.time_lcdNumber.display(self.time_lcdNumber.intValue()-1) if self.time_lcdNumber.intValue() == 0: self.myWin5 = ui_score.MyWindow5() self.myWin5.show() self.hide()
打开网页连接
个人小伙伴还写了一个html的诚信考试协议,嘻嘻,不签协议怎么能让你考试呢是吧:)
打开本地html文件我是经过os模块执行start命令行命令来实现,可是有个问题是打开的时候会出现黑窗口闪烁,这个bug尚未解决。
程序打包
终于完成项目后怎么能不和小伙伴们分享呢(特别是让家里的弟弟妹妹感觉一下被算术统治的恐怖hhh)。
python打包的方法有几种,经常使用的是Py2exe和PyInstaller,由于前者用于老版本的python,可能打包过程当中会出现各类问题,我选择了或者。安装方式很简单,直接pip install PyInstaller。
pyinstaller语法也简单执行命令: pyinstaller main.py
main.py是我程序入口,固然个人工程里不能只有一个py文件,因此你会发现这样打包后的exe并不能用QAQ
加上-w参数,会递归打包引用的其余py: pyinstaller -w main.py
(我试过加上-F,打包成一个文件,可是最后的exe并不能运行,我也不知道为啥)
而后会看到新增长了两个目录build和dist,dist下面的文件夹里的exe就是能够发布的可执行文件。固然,得把你的资源文件复制到文件夹下面。EXE文件会自动加上一个图标,若是想改本身的图标输入pyinstaller时命令添加一个 -i picture.ioc(路径),太懒(困)我就没弄…
点击main.exe就能够运行了,其实这个课执行文件比我想象中的要小,才1608K,固然包括其余动态库就不止这点了,QT的一个很差的地方就是设计的程序会比通常其余开发环境的大上一些。
固然,以为这么多文件不美观,ctrl+shift拖动文件在桌面建个快捷方式吧。