网络编程
位置:首页>> 网络编程>> Python编程>> PyQt5 PySide2 触摸测试功能的实现代码

PyQt5 PySide2 触摸测试功能的实现代码

作者:cqust_qilin02811  发布时间:2022-06-23 22:22:25 

标签:PyQt5,PySide2,触摸测试

一、前言

该测试功能是Linux产测软件的一个子功能,主要涉及:
140行代码
PySide2的Event、信号和槽、QLabel,QWidget。
QLabel实现每个小框,QWidget作为主界面

另外发现PySide2和Pyqt5没啥大区别,只要把import的包改好,代码是可以两方通用的。

手指滑动,手指坐标所在方块的颜色发生改变,如果手指划出方块区域,则所有已染色方块清空颜色,松开事件同理

实现效果:

PyQt5 PySide2 触摸测试功能的实现代码

PyQt5 PySide2 触摸测试功能的实现代码

二、实现思路:

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

0
投稿

猜你喜欢

  • 但是如果是让你接手一个二等残废的网站,并让你在上面改版,而且不能推翻式改版,只能逐步替换旧的程序,那么你会非常痛苦,例如我遇到的问题: 问题
  • Opera, 作为 A-Grade 浏览器,在现在的前端开发中务必支持。它很优秀,很不幸,bug是每个浏览器都不可避免的问题,Opera亦难
  • 前言本博客默认读者对神经网络与Tensorflow有一定了解,对其中的一些术语不再做具体解释。并且本博客主要以图片数据为例进行介绍,如有错误
  • 假设你有一套登录注册业务。一开始很简单,老板说只需要常规的注册登录就行。但是到了后面,接口被刷,老板然你在注册登录前加个验证码然后没过多久,
  • 1.ROOT_URLCONF = '总路由所在路径(比如untitled.urls)'<===默认情况是这样根路由的路
  • 当点了链接后,跳出的网页地址是https://www.aspxhome.com/ 或https://www.cidianwang.
  • 简介使用 Python 进行数据分析时,比较常用的库有 Numpy、Pandas、Matplotlib,本篇文章就来说一下 Numpy 的使
  • 一、如果models.py文件为时:timestamp = models.DateTimeField('保存日期')会提示:
  • asp之家注:那么为什么要使用分页呢?当记录不多的时候,如10个或20个,我们可以也没必要使用分页来显示数据,但是数据是在不断增加的,当到了
  • 前言不要在用手敲生成Excel数据报表了,用Python自动生成Excel数据报表!废话不多说让我们愉快地开始吧~开发工具Python版本:
  • 本文实例讲述了python求众数问题的方法,是一个比较典型的应用。分享给大家供大家参考。具体如下:问题描述:多重集中重数最大的元素称为众数.
  • 昨天群里介绍了一个专门帮你PS图片的网站。吐司网。网站在图片的预览处理上有点意思。当鼠标经过图片,显示为处理过的图片。这样大家能很清晰的对比
  • 做设计类网址导航的初衷是为了资源整合,也是在尝试解决问题。假定访问用户都是行业人士,或者目地性很强的有一定了解的用户,应该如何考虑这个组织系
  • Microsoft? SQL Server? 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存
  • 本文实例讲述了微信小程序学习笔记之文件上传、下载操作。分享给大家供大家参考,具体如下:前面介绍了微信小程序登录API与获取用户信息操作。这里
  • 很久以前就知道微软的Petshop的很经典,昨天抽出时间去学习,一开始还真的不适应,什么成员资格,还真的看不太懂,运行petshop想从登陆
  • 摘要:本文主要是讲解怎么样替换某一列的一个值。应用场景:假如我们有以下的数据集:我们想把里面不是pre的字符串全部换成Nonpre,我们要怎
  • 1.字典的概念字典和列表类似,也是可变序列,不过和列表不同,它是无序的可变序列,保存的内容是以键值对(key:value)形式存放的 字典的
  • 摘要:python的设计核心原则就是简洁——在这种原则的指导下,诞生了lambda表达式和偏函数:二者都让函数调用变得简洁。本文主要为你介绍
  • 每次查询分析器寻找路径时,并不会每一次都去统计索引中包含的行数,值的范围等,而是根据一定条件创建和更新这些信息后保存到数据库中,这也就是所谓
手机版 网络编程 asp之家 www.aspxhome.com