PyQt5 PySide2 触摸测试功能的实现代码
作者:cqust_qilin02811 发布时间:2022-06-23 22:22:25
一、前言
该测试功能是Linux产测软件的一个子功能,主要涉及:
140行代码
PySide2的Event、信号和槽、QLabel,QWidget。
QLabel实现每个小框,QWidget作为主界面
另外发现PySide2和Pyqt5没啥大区别,只要把import的包改好,代码是可以两方通用的。
手指滑动,手指坐标所在方块的颜色发生改变,如果手指划出方块区域,则所有已染色方块清空颜色,松开事件同理
实现效果:
二、实现思路:
1.使用GridLayout,绘制四周方格,方格初始化为黄色,点击到则为红色
2.重写Label,对每个label定义x,y表示所在gridlayout中的位置
如x = 1,y = 3表示label位于第一行第三列,left,right,top,bottom表示方格四条边的实际坐标
3.重写moveEvent事件和ReleaseEvent事件,
moveEvnet事件:
每次鼠标移动即触发moveEvent,则发出已经定义的信号move_signal
move_singal.connect(self.manager_touch)
manager_touch是判断当前鼠标是否位于方格内,如果在方格内则染色,如果鼠标划入空白部分,则清空所有方块颜色
另对染色label进行计数,如果达到绘制的label的总数量则发出信号返回测试通过
ReleaseEvent事件:
鼠标左键松开(对应手指离开屏幕)即触发ReleaseEvent,则清空已染色方块,另把已染色方块数量清零
4.clear_sources: 在退出页面前应将保存label的列表即self.touch_labels清空,否则重启该界面会报错
三、实现代码:
sytle.py
COLOR_RED = "color: rgb(255, 255, 255); background-color: #FF0000;"
COLOR_YELLOW = "color: rgb(255, 255, 255); background-color: #FFFF00;"
COLOR_WHITE = "color: rgb(255, 255, 255); background-color: #FFFFFF;"
COLOR_BLACK = "color: rgb(255, 255, 255); background-color: #000000;"
COLOR_GREEN = "color: rgb(255, 255, 255); background-color: #00FF00;"
COLOR_BLUE = "color: rgb(255, 255, 255); background-color: #0000FF;"
COLOR_PURPLE = "color: rgb(255, 255, 255); background-color: #871F78;"
main.py
import sys
from functools import partial
from PySide2 import QtWidgets
from PySide2.QtCore import Qt, Signal
from PySide2.QtGui import QCursor
from PySide2.QtWidgets import QGridLayout, QPushButton, QWidget, QApplication
import style
class TouchLabel(QtWidgets.QLabel):
def __init__(self, i, j, top, bottom, left, right, target, parent=None):
super(TouchLabel, self).__init__(parent)
self.setStyleSheet(style.COLOR_YELLOW)
self.flag = False # 如果被滑过则置为True
self.target = target
self.x = i # x,y 代表在gridLayout中的位置
self.y = j
self.flag = False
self.left = left
self.right = right
self.top = top
self.bottom = bottom
class TouchWidget(QWidget):
touch_labels = [] # 存储label的列表
sum_moved_labels = 0
move_signal = Signal()
out_signal = Signal()
release_signal = Signal()
def __init__(self):
super().__init__()
self.sum_labels = 0 # 统计染色的方块个数
self.target = 0
print("start TouchWidget")
self.setWindowFlags(Qt.FramelessWindowHint)
self.showFullScreen()
self.init_parameters() # 初始化gridlayout的参数
print("绘制的按钮个数为:" + str(self.target))
def init_parameters(self):
self.layout = QGridLayout(self)
self.layout.setMargin(0) # 设置widget离窗口的距离
self.layout.setSpacing(0) # 设置控件间距
self.row = 10 # 纵向的按钮数量
self.column = 10 # 横向的按钮数量
desktop = QtWidgets.QApplication.desktop()
global label_width, label_height
label_width = desktop.width() / self.column # 列宽
label_height = desktop.height() / self.row # 行高
self.target = self.row * 2 + self.column * 2 - 4
self.touch_labels.clear()
self.init_touch_label(self.row, self.column, label_height, label_width)
self.add_touch_label(label_width, label_height)
def init_touch_label(self, row, column, label_height, label_width):
desktop = QtWidgets.QApplication.desktop()
height = desktop.height()
width = desktop.width()
for i in range(row):
for j in range(column):
if i == 0 and j == 0:
label = TouchLabel(i, j, 0, label_height, 0, label_width, self.target)
self.touch_labels.append(label)
elif i == 0 and j != 0:
label = TouchLabel(i, j, 0, label_height, j * label_width, (j + 1) * label_width, self.target)
self.touch_labels.append(label)
elif i != 0 and j == 0:
label = TouchLabel(i, j, i * label_height, (i + 1) * label_height, 0, label_width, self.target)
self.touch_labels.append(label)
elif i == row - 1 and j != 0:
label = TouchLabel(i, j, height - label_height, height, j * label_width, (j + 1) * label_width,
self.target)
self.touch_labels.append(label)
elif j == column - 1 and i != 0:
label = TouchLabel(i, j, i * label_height, (i + 1) * label_height, width - label_width, width,
self.target)
self.touch_labels.append(label)
def add_touch_label(self, label_width, label_height):
for label in self.touch_labels:
self.layout.addWidget(label, label.x, label.y, 1, 1)
nopass_quit_btn = QPushButton("如果测试不通过,点击此按钮退出")
nopass_quit_btn.setMinimumSize(label_width, label_height)
self.layout.addWidget(nopass_quit_btn, self.row / 2 - 1, self.column / 2 - 1, 3, 3)
nopass_quit_btn.clicked.connect(partial(self.on_result, "TEST NOT PASS"))
self.move_signal.connect(self.manager_touch)
self.out_signal.connect(partial(self.on_result, "TEST PASS"))
self.release_signal.connect(self.clear_label_status)
def manager_touch(self):
desktop = QtWidgets.QApplication.desktop()
frontier_top = label_height
frontier_bottom = desktop.height() - label_height
frontier_left = label_width
frontier_right = desktop.width() - label_width
x = QCursor.pos().x()
y = QCursor.pos().y()
if frontier_left <= x <= frontier_right and frontier_top <= y <= frontier_bottom:
self.clear_label_status()
print("手指划出边界,清空所有方块颜色")
for label in self.touch_labels:
if label.left <= x <= label.right and label.top <= y <= label.bottom:
if label.flag:
continue
else:
label.setStyleSheet(style.COLOR_RED)
TouchWidget.sum_moved_labels += 1
label.flag = True
if TouchWidget.sum_moved_labels == self.target:
self.out_signal.emit()
def clear_label_status(self):
for label in self.touch_labels:
label.setStyleSheet(style.COLOR_YELLOW)
label.flag = False
TouchWidget.sum_moved_labels = 0
def clear_sources(self):
TouchWidget.sum_moved_labels = 0
self.touch_labels.clear()
self.sum_moved_labels = 0
self.target = 0
def mouseMoveEvent(self, event):
self.move_signal.emit()
def mouseReleaseEvent(self, event):
self.release_signal.emit()
print("释放焦点,清空所有方块颜色")
def on_result(self, ret):
self.clear_sources()
print(ret)
self.close()
if __name__ == '__main__':
app = QApplication()
widget = TouchWidget()
widget.show()
sys.exit(app.exec_())
来源:https://blog.csdn.net/qq_45933509/article/details/129746582


猜你喜欢
- 前提:安装xhtml2pdf https://pypi.python.org/pypi/xhtml2pdf/下载字体:微软雅黑;待转换的文件
- 下面是出现的错误解释RuntimeError: An attempt ha
- 由于这两天换了IDE,在导入以前的工程的时候发现了一个大问题,由于以前脑残的我不知道改编码方式,导致出现了大量的GBK,这就很难受,要是一个
- 中间件中间件是放在客户端和服务端的中间。 当你的客户端对某个接口发起一个请求,但是在到达接口2之前,这里是有一层中间件的处理。一般
- 前言如果你搜一圈 "Fabric "关键字,你会发现 90% 的资料都是过时的,因为现在 Fabric 支持 Pytho
- 此模块允许你输出类似Unix cal程序的日历,并提供与日历相关的其他有用功能。值得注意的是,默认情况下,这些日历将星期一作为一
- 解决办法一(ThinkPHP官方提供的办法,我并没有测试过):升级到ThinkPHP3.1最新的UploadFile.class.php(h
- 从人类认知的角度的看,人类擅长识别并不擅长于记忆,当一个用户面对浩瀚的信息海洋,通常会产生畏惧感,会本能的对这些信息片段进行加工找出其内在的
- 如果你没有序列号,那么就只能在上面的三种free edition(Enterprise Evaluation、Express、Express
- 相信大家在日常学习或者是阅读英文文章的过程中,难免会出现几个不认识的单词,或者想快速翻译某段英文的意思。今天,利用Python爬虫等知识,教
- pyinstaller 属于Python第三方库,使用前需先安装# 首先安装pyinstallerpip install pyinstall
- 需要安装pywin32模块,pip install pywin32##pip install pywin32import win32api,
- 首先,在数据库中创建一个表,用于存放图片:CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCRE
- 首先,到底什么是网络服务器?简而言之,它是在物理服务器上搭建的一个网络连接服务器(networking server),永久地等待客户端发送
- 声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。通过傅里叶变换,可以将时间域的声音函数分解
- 本文实例讲述了python获取指定网页上所有超链接的方法。分享给大家供大家参考。具体如下:这段python代码通过urllib2抓取网页,然
- 预编译语句预编译语句是一种用于执行参数化SQL查询的技术,它可以提高性能并减少SQL注入的风险。预编译语句主要有以下优势:避免SQL注入攻击
- ALTER TABLE允许你修改一个现有表的结构。例如,你可以增加或删除列、创造或消去索引、改变现有列的类型、或重新命名列或表本身。你也能改
- 在 MySQL 中,可以使用 ALTER TABLE 语句来添加表字段。以下是一些示例代码,可以批量添加多个字段:1 m
- 左右布局,图片的宽度不固定。正好前几天测试闭合浮动元素时发现了overflow的特殊现象,倒是正好可以用在这里。测试通过:ie6/7&nbs