PyQt5 PySide2 觸摸測試功能的實現(xiàn)代碼
一、前言
該測試功能是Linux產(chǎn)測軟件的一個子功能,主要涉及:
140行代碼
PySide2的Event、信號和槽、QLabel,QWidget。
QLabel實現(xiàn)每個小框,QWidget作為主界面
另外發(fā)現(xiàn)PySide2和Pyqt5沒啥大區(qū)別,只要把import的包改好,代碼是可以兩方通用的。
手指滑動,手指坐標(biāo)所在方塊的顏色發(fā)生改變,如果手指劃出方塊區(qū)域,則所有已染色方塊清空顏色,松開事件同理
實現(xiàn)效果:
二、實現(xiàn)思路:
1.使用GridLayout,繪制四周方格,方格初始化為黃色,點擊到則為紅色
2.重寫Label,對每個label定義x,y表示所在gridlayout中的位置
如x = 1,y = 3表示label位于第一行第三列,left,right,top,bottom表示方格四條邊的實際坐標(biāo)
3.重寫moveEvent事件和ReleaseEvent事件,
moveEvnet事件:
每次鼠標(biāo)移動即觸發(fā)moveEvent,則發(fā)出已經(jīng)定義的信號move_signal
move_singal.connect(self.manager_touch)
manager_touch是判斷當(dāng)前鼠標(biāo)是否位于方格內(nèi),如果在方格內(nèi)則染色,如果鼠標(biāo)劃入空白部分,則清空所有方塊顏色
另對染色label進(jìn)行計數(shù),如果達(dá)到繪制的label的總數(shù)量則發(fā)出信號返回測試通過
ReleaseEvent事件:
鼠標(biāo)左鍵松開(對應(yīng)手指離開屏幕)即觸發(fā)ReleaseEvent,則清空已染色方塊,另把已染色方塊數(shù)量清零
4.clear_sources: 在退出頁面前應(yīng)將保存label的列表即self.touch_labels清空,否則重啟該界面會報錯
三、實現(xiàn)代碼:
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 # 統(tǒng)計染色的方塊個數(shù) self.target = 0 print("start TouchWidget") self.setWindowFlags(Qt.FramelessWindowHint) self.showFullScreen() self.init_parameters() # 初始化gridlayout的參數(shù) print("繪制的按鈕個數(shù)為:" + str(self.target)) def init_parameters(self): self.layout = QGridLayout(self) self.layout.setMargin(0) # 設(shè)置widget離窗口的距離 self.layout.setSpacing(0) # 設(shè)置控件間距 self.row = 10 # 縱向的按鈕數(shù)量 self.column = 10 # 橫向的按鈕數(shù)量 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_())
到此這篇關(guān)于PyQt5 PySide2 觸摸測試功能的實現(xiàn)的文章就介紹到這了,更多相關(guān)PyQt5 PySide2 觸摸測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中的Json模塊dumps、dump、loads、load函數(shù)用法詳解
這篇文章主要介紹了python中的Json模塊dumps、dump、loads、load函數(shù)用法講解,本文逐一介紹結(jié)合實例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-11-11matplotlib之pyplot模塊坐標(biāo)軸范圍設(shè)置(autoscale(),xlim(),ylim())
這篇文章主要介紹了matplotlib之pyplot模塊坐標(biāo)軸范圍設(shè)置(autoscale(),xlim(),ylim()),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03python調(diào)用excel_vba的兩種實現(xiàn)方式
本文主要介紹了python調(diào)用excel_vba的兩種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Python+Appium實現(xiàn)自動化測試的使用步驟
這篇文章主要介紹了Python+Appium實現(xiàn)自動化測試的使用步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03一篇教程教你學(xué)會Python進(jìn)制轉(zhuǎn)換(十進(jìn)制轉(zhuǎn)二進(jìn)制、八進(jìn)制、十六進(jìn)制)
計算機(jī)中只有1和0,所以就導(dǎo)致很多時候需要進(jìn)制轉(zhuǎn)換,本文介紹了Python進(jìn)制轉(zhuǎn)換,十進(jìn)制轉(zhuǎn)二進(jìn)制,十進(jìn)制轉(zhuǎn)八進(jìn)制,十進(jìn)制轉(zhuǎn)十六進(jìn)制,有興趣的可以了解一下2021-05-05Python 抓取動態(tài)網(wǎng)頁內(nèi)容方案詳解
這篇文章主要介紹了Python 抓取動態(tài)網(wǎng)頁內(nèi)容方案詳解,首先通過Chrome的工具來進(jìn)行分析,然后再使用python進(jìn)行處理,最終得到我們需要的內(nèi)容,非常的方便,這里也算是給大家提供一個思路2014-12-12Python中enumerate()函數(shù)編寫更Pythonic的循環(huán)
本篇文章主要大家通過實例講述了Python中enumerate()函數(shù)編寫更Pythonic的循環(huán)的知識點,有興趣的朋友參考學(xué)習(xí)下。2018-03-03