博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pyqt实现界面化编程
阅读量:4186 次
发布时间:2019-05-26

本文共 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.接下来就是键盘的实现了

  1. 定义发送给测试用例界面的信号
signalShowText = QtCore.pyqtSignal(str)
  1. 设置界面无边框和置顶显示
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,感觉还是蛮好的,。

你可能感兴趣的文章
一个“Spring轮子”引发的“血案”(2)
查看>>
EasyJF开源网上会议系统iula-0.1.0发布
查看>>
一个“Spring轮子”引发的血案(1)
查看>>
世界杯与国产开源(五)-“君子剑”
查看>>
一个命令搞定Java Web通用添删改查及分页代码生成(音视频)
查看>>
EasyJWeb-0.6.0版本新功能简介
查看>>
EasyJWeb里程碑0.6.0版发布
查看>>
世界杯与国产开源(四)-为梦而生
查看>>
Spring中的Rod Johnson 与“轮子理论”
查看>>
世界杯与国产开源(三)-团队之星
查看>>
开源EasyJFShoppingOnline项目正式公开邀请行业精英
查看>>
编码讨论---乱码问题之终极解决
查看>>
EasyJFCMS项目正式启动,诚邀国内开源爱好者加入(附uml图)
查看>>
世界杯与国产开源(二)
查看>>
世界杯与国产开源(一)
查看>>
eclipse 中 Subversion 切换 帐号登陆
查看>>
庆祝世界杯开幕,EasyJF官网全站源码对外开放
查看>>
《80前的前辈,你们都做了些什么?!》一文的正确解读及是是非非
查看>>
开源的世界很精
查看>>
国产开源环境的是非,《80前》一文引起的争论
查看>>