本文共 4905 字,大约阅读时间需要 16 分钟。
在网上查找有关pyqt的资源,说实话,少的可怜,不过如果你有Qt的编程经验,转一下pyqt也是一件很方便的事,自己摸索着写了一个小型的输入键盘,测试用例是一个很简单的界面框图,当然写这个小项目的目的是为了熟悉pyqt的编程,这种小项目如果用Qt写的话,一个小时足够了,因为是第一次接触pyqt,对于pyqt,我基本就是个小白,但当你熟悉之后,会发现pyqt和Qt基本一样,都有信号和槽,信号槽是什么东西,相信会编程的都了解,这里就不在都啰嗦。但在后面会说一下pyqt里面信号槽的实现。
废话不说了,先上效果图: 这个小工具大体有以下结构: 在测试用里面调用键盘,也就是说测试用例是父类。键盘是测试用例的子类,字符输入键盘是键盘的子类1.首先来看一下测试用例的实现,测试用例也就是整体的main函数,在main函数里面运行并调用键盘
# -*- coding: utf-8 -*-from PyQt5.QtWidgets import QWidgetfrom PyQt5 import QtWidgetsimport sys# 从keyBoard.py文件里面引入KeyBoardfrom keyBoard import KeyBoardfrom Ui_main import Ui_Mainclass Main(QWidget, Ui_Main): # 构建 def __init__(self, parent=None): #避免多重调用 super(Main, self).__init__(parent) self.setupUi(self) # new self.m_pkeyBoard = KeyBoard() # 该类的界面按钮信号槽连接 self.btn.clicked.connect(self.on_btn_fn_clicked) # 两个类之间的信号槽连接 self.m_pkeyBoard.signalShowText.connect(self.slot_recive_text) # 定义该类的成员函数 def on_btn_fn_clicked(self): m_pPoint = QtWidgets.QApplication.desktop() self.m_pkeyBoard.move(m_pPoint.width() * 6 / 10, m_pPoint.height() * 4 / 10 ) self.m_pkeyBoard.show() # 定义接收数据的槽函数 def slot_recive_text(self, str_Text): self.lb.setText(str_Text)# mainif __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) Dlg = Main() Dlg.show() sys.exit(app.exec_())
2.接下来就是键盘的实现了
signalShowText = QtCore.pyqtSignal(str)
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
这些设置和Qt里面几乎一样
3. 虚函数的实现# 鼠標事件 def mousePressEvent(self, event): global m_pPoint m_pPoint = event.globalPos() - self.pos() event.accept() # 鼠標事件 def mouseMoveEvent(self, event): self.move(event.globalPos() - m_pPoint) event.accept() # 鼠標事件 def enterEvent(self, event): self.setCursor(Qt.PointingHandCursor) event.accept() # 鼠標事件 def leaveEvent(self, event): self.setCursor(Qt.ArrowCursor) event.accept()
4 定义全局变量
全局变量在成员函数中使用时,一定要先申明一次,在前面加global,后面会讲到str_key = ""m_nType = 1m_pPoint = (0, 0)
5.接下来就是实现界面按钮的功能
下面这行代码是 连接btn_2的clicked事件,但是槽函数名不能写成像Qt一样on_btn_2_clicked
如果是这样,即使不用下面的这行代码连接信号槽,btn_2的clicked事件也会被执行,并且被执行两次,我想应该是在由界面转换为代码的时候就已经有连接了,具体原因不知道,如果有大神看到的话,还望解答。 self.btn_2.clicked.connect(self.on_btn_f2_clicked)
这里只实现一个键的,其余键都差不多
#2鍵 def on_btn_f2_clicked(self): global str_key if m_nType == 1: str_key += "2" self.btn_Show.setText(str_key) elif m_nType == 2: if self.btn_Space.isChecked(): qstr = 'A;B;C;' else: qstr = 'a;b;c;' qList = qstr.split(';') print(qList) self.m_pDetailWidget.set_small_pad_text(qList) m_pPoint = self.btn_2.pos() + self.pos() self.m_pDetailWidget.move(m_pPoint.x(),m_pPoint.y() - 35) elif m_nType == 3: str_key += "%" self.btn_Show.setText(str_key)
6.键盘的初始化
因为pyqt里面的QStringList类型很难直接定义并使用,因此在本次设计中我采用了QString转QStringList的方法来实现,如下所示就是转换方法qstr = '1;2;3;4;5;6;7;8;9;└┘;0'qList = qstr.split(';')
def init_pad_text(self, m_type): if m_type == 1: qstr = '1;2;3;4;5;6;7;8;9;└┘;0' qList = qstr.split(';') self.set_pad_text(qList) elif m_type == 2: if self.btn_Space.isChecked(): qstr = ',?!;ABC;DEF;GHI;JKL;OMN;PQRS;TUV;WXYZ;shift;└┘' qList = qstr.split(';') self.set_pad_text(qList) else: qstr = ',?!;abc;def;ghi;jkl;omn;pqrs;tuv;wxyz;shift;└┘' qList = qstr.split(';') self.set_pad_text(qList) elif m_type == 3: qstr = '@;%;!;+;*;√;-;/;×;└┘;△' qList = qstr.split(';') self.set_pad_text(qList)
7.键盘字符的设置
如题所示,该键盘就是简单地宫字格九键按键键盘,要同时包含因为字符,所以我们在每次切换的时候就要重新设置键盘上的显示字符def set_pad_text(self, strlist ): self.btn_1.setText(strlist[0]) self.btn_2.setText(strlist[1]) self.btn_3.setText(strlist[2]) self.btn_4.setText(strlist[3]) self.btn_5.setText(strlist[4]) self.btn_6.setText(strlist[5]) self.btn_7.setText(strlist[6]) self.btn_8.setText(strlist[7]) self.btn_9.setText(strlist[8]) self.btn_Space.setText(strlist[9]) self.btn_0.setText(strlist[10])
8.pyqt里面父类和子类之间信息的传递,信号槽是我们最常用的一种方法,这里我也采用了信号槽的通信
1.首先,在子类里面定义信号signalText = QtCore.pyqtSignal(str)
信号要在子类的init_ 函数 前面定义
2.在父类里面引入之类from DetailWidget import DetailWidget
这句话的意思是从DetailWidget (.py)文件里面引入DetailWidget 类
3.接下来就是信号槽的连接了self.m_pDetailWidget = DetailWidget()self.m_pDetailWidget.signalText.connect(self.slot_text)
首先当然是要new一个对象出来,当然这些东西和Qt的实现基本上差不多,但是在pyqt5以后,信号槽的连接和pyqt4的差距还是很大的
4.还差最终的一步,就是槽函数的实现了# 接收小鍵盤數據def slot_text(self, str_text): global str_key str_key += str_text self.btn_Show.setText(str_key)
基本的内容就这些,毕竟是第一次接触pyqt,感觉还是蛮好的,。