小结2 GUI编程 PyQt5

模块

QtCore:包含了核心的非GUI功能。此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程。
QtGui包含类窗口系统集成、事件处理、二维图形、基本成像、字体和文本。
qtwidgets模块包含创造经典桌面风格的用户界面提供了一套UI元素的类。
QtMultimedia包含的类来处理多媒体内容和API来访问相机和收音机的功能。
Qtbluetooth模块包含类的扫描设备和连接并与他们互动。描述模块包含了网络编程的类。这些类便于TCP和IP和UDP客户端和服务器的编码,使网络编程更容易和更便携。
Qtpositioning包含类的利用各种可能的来源,确定位置,包括卫星、Wi-Fi、或一个文本文件。
Enginio模块实现了客户端库访问Qt云服务托管的应用程序运行时。
Qtwebsockets模块包含实现WebSocket协议类。
QtWebKit包含一个基于Webkit2图书馆Web浏览器实现类。
Qtwebkitwidgets包含的类的基础webkit1一用于qtwidgets应用Web浏览器的实现。
QtXml包含与XML文件的类。这个模块为SAX和DOM API提供了实现。
QtSvg模块提供了显示SVG文件内容的类。可伸缩矢量图形(SVG)是一种描述二维图形和图形应用的语言。
QtSql模块提供操作数据库的类。
QtTest包含的功能,使pyqt5应用程序的单元测试

QWidget控件是PyQt5中所有用户界面的父类,QWidget对象创建成为一个应用的顶层窗口。这里使用了没有参数的默认构造函数,它没有父类,我们称没有父类的控件为窗口。
QWidget运行后就只有一个“页面”,而QMainWindow运行后生成了一个“窗口”。
QMainWindow的布局如下图所示:
在这里插入图片描述

从外到内依次是菜单栏、状态栏、工具栏、停靠窗口、中心窗口。
查看帮助文档可以发现,setMenuBar、addToolBar、setCentralWidget、setStatusBar几种行为只有QMainWindow类具有。
因此,在继承自QWidget类的用户类中无法创建菜单栏等几种行为。
这就是QMainWindow和QWidget的主要区别。

可在下面网页查找QT的类及包含的函数
http://www.kuqin.com/qtdocument/classes.html

布局

布局就是如何管理应用中的元素和窗口。有两种方式可以搞定:绝对定位和PyQt5的layout类

绝对定位

每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个元素和窗口的位置。

局限性:

  • 元素不会随着我们更改窗口的位置和大小而变化。
  • 不能适用于不同的平台和不同分辨率的显示器
  • 更改应用字体大小会破坏布局
  • 如果我们决定重构这个应用,需要全部计算一下每个元素的位置和大小

import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplication

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI():
    	label1=QLabel('hello',self)
    	label1.move(10,10)

#用move()方法定位了每一个元素,使用x、y坐标。x、y坐标的原点是程序的左上角。

    	label2=QLabel('world',self)
    	label2.move(25,25)
    	self.setGeometry(300, 300, 250, 150)
    	self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

效果图在这里插入图片描述

栅格布局

QGridLayout模块
实例:创建计算器

import sys
from PyQt5.QtWidgets import (QWidget, QGridLayout, 
   QPushButton, QApplication)

class Example(QWidget):
   def __init__(self):
       super().__init__()
       self.initUI()
   def initUI(self):
      #建立网格
       grid = QGridLayout()
       self.setLayout(grid)
      #按钮名称
       names = ['Cls', 'Bck', '', 'Close',
                '7', '8', '9', '/',
               '4', '5', '6', '*',
                '1', '2', '3', '-',
               '0', '.', '=', '+']
       #位置
       positions = [(i,j) for i in range(5) for j in range(4)]
       #生成按钮
       for position, name in zip(positions, names):
           if name == '':
               continue
           button = QPushButton(name)
           grid.addWidget(button, *position)
       self.move(300, 150)
       self.setWindowTitle('Calculator')
       self.show()
if __name__ == '__main__':
   app = QApplication(sys.argv)
   ex = Example()
   sys.exit(app.exec_())

提交反馈信息

QLineEdit 行编辑

def findtriggered(self):#查找
        findDlg = QDialog(self)
        findDlg.setWindowTitle('查找...')

        self.find_textLineEdit = QLineEdit(findDlg)#行编辑
        find_next_button = QPushButton('查找下一个', findDlg)
        find_last_button = QPushButton('查找上一个', findDlg)

        v_layout = QVBoxLayout(self)#垂直布局
        v_layout.addWidget(find_last_button)#加入按钮
        v_layout.addWidget(find_next_button)

        h_layout = QHBoxLayout(findDlg)#水平布局
        h_layout.addWidget(self.find_textLineEdit)加入行编辑
        h_layout.addLayout(v_layout)

        find_last_button.clicked.connect(self.findLast)#对应时间
        find_next_button.clicked.connect(self.findNext)


        findDlg.show()

事件

在事件模型中,有三个角色:

  • 事件源 : 发生了状态改变的对象。
  • 事件 : 这个对象状态改变的内容。
  • 事件目标 : 事件想作用的目标。
    作用机制:事件源绑定事件处理函数,然后作用于事件目标身上

PyQt5处理事件方面有个signal and slot机制。Signals and slots用于对象间的通讯。事件触发的时候,发生一个signal,slot是用来被Python调用的。
例:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider, 
    QVBoxLayout, QApplication)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()
    def initUI(self):

        lcd = QLCDNumber(self)
        sld = QSlider(Qt.Horizontal, self)

        vbox = QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(sld)

        self.setLayout(vbox)
        sld.valueChanged.connect(lcd.display)
        #上式中,中间参数可变,括号内为连接的相应的变化的值(可为函数,需自己另定义),即当sld变化时,lcd的值相应变化
        #switch.triggered.connect(self.switchtriggered) 此代码中,中间参数变化,因前面switch对应类型为QAction
        #redb.clicked.connect(self.setColor)   redb对应为QPushButton
        
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Signal and slot')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

菜单栏和工具栏 状态栏

模块
QtWidget
QtGui

menuBar() 返回主窗口的QMenuBar对象
addMenu() 在菜单栏中添加一个新的QMenu对象
addAction() 向QMenu小控件中添加一个操作按钮,其中包含文本或图标
setEnabled() 将操作按钮设置为启用/禁用
addSeperator() 在菜单中添加一条分割线
clear() 删除菜单栏的内容
setShortcut() 将快捷键关联到操作按钮
setText() 设置菜单项的文本
setTitle() 设置QMenu小控件的标题
text() 返回与QACtion对象关联的文本
完整例子见

菜单栏

树状菜单

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow,QAction,qApp,QMune
class Example(QMainWindow):
    def __init__(self,parent=None):
        super().__init__()
        self.initUI()
    def initUI(self): 
        #实例化主窗口的QMenuBar对象
        bar=self.menuBar()
        #向菜单栏中添加新的QMenu对象,父菜单
        file=bar.addMenu('File')
        #向QMenu小控件中添加按钮,子菜单
        new=file.addAction(QIcon('New'))
        #添加孙菜单
        form=bar.addMenu('格式(O)')
        newitch.addAction('open')

勾选菜单

        #创建勾选菜单 
        close=QAction('关闭',self,checkable=True)
        close.setChecked(True)#默认状态
        close.triggered.connect(self.close)#响应事件
        bar.addAction(close)

右键菜单

	#创建右键菜单
    def contextMenuEvent(self, event):
           cmenu = QMenu(self)
           newAct = cmenu.addAction("New")
           opnAct = cmenu.addAction("Open")
           quitAct = cmenu.addAction("Quit")
           action = cmenu.exec_(self.mapToGlobal(event.pos()))

           if action == quitAct:
               qApp.quit()

QT菜单图标不显示

self.setWindowIcon(QIcon('c://users/53877/desktop/7.png'))
#地址为'//'而非'/',否则易出现'unicodeescape' codec can't decode bytes in position’错误,只需保证不出现‘/u’即可,复制的地址中为'\',可能无法显示图标

准确确认,该图片文件是否是一个合法的图标。
图像和图标之间是有比较大区别的
在这里插入图片描述

工具栏

        #添加工具栏
		toolbar=self.addToolBal('save')
		toolbar.addAction(save)

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow,QAction,qApp,QMune
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
    def __init__(self,parent=None):
        super().__init__()
        self.initUI()
    def initUI(self): 
        #实例化主窗口的QMenuBar对象
        bar=self.menuBar()
        #向菜单栏中添加新的QMenu对象,父菜单
        file=bar.addMenu('File')
        #向QMenu小控件中添加按钮,子菜单
        new=file.addAction(QIcon('New'))
        #添加孙菜单
        form=bar.addMenu('格式(O)')
        newitch.addAction('open')
     
        #创建勾选菜单 
        close=QAction('关闭',self,checkable=True)
        close.setChecked(True)#默认状态
        close.triggered.connect(self.close)#响应事件
        bar.addAction(close)
		
        #定义响应小控件按钮,并设置快捷键关联到操作按钮,添加到父菜单下
        savesw=QAction('Save',self)
        save.setShortcut('Ctrl+S')
        file.addAction(save)
        #添加工具栏
		toolbar=self.addToolBal('save')
		toolbar.addAction(save)

        #添加父菜单(包括父菜单图标)
        quit=QAction(QIcon('quit.jpg'),'Quit',self)
       #添加状态
        quit.setStatusTip('退出')
        file.addAction(quit)
		#工具栏
		quitbar=self.addToolBar('save')
		quirbar.addAction(quit)
		
        #单击任何Qmenu对象,都会发射信号,绑定槽函数
        file.triggered[QAction].connect(self.processtrigger)

        #设置布局及标题
        self.setLayout(layout)
        self.setWindowTitle('menu例子')
	#创建右键菜单
    def contextMenuEvent(self, event):
           cmenu = QMenu(self)
           newAct = cmenu.addAction("New")
           opnAct = cmenu.addAction("Open")
           quitAct = cmenu.addAction("Quit")
           action = cmenu.exec_(self.mapToGlobal(event.pos()))

           if action == quitAct:
               qApp.quit()
    
    def processtrigger(self,q):
        #输出那个Qmenu对象被点击
        print(q.text()+'is triggeres')

if __name__ == '__main__':
    app=QApplication(sys.argv)
    ex=example()
    sys.exit(app.exec_())

创建编辑文本

import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication
from PyQt5.QtGui import QIcon


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):               
		#创建了一个文本编辑区域,并把它放在QMainWindow的中间区域。这个组件或占满所有剩余的区域。
        textEdit = QTextEdit()
        self.setCentralWidget(textEdit)
        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Main window')    
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

打开文件

Qwidget 中QFileDialog

    def opentriggered(self):#打开文件
        fname = QFileDialog.getOpenFileName(self, 'Open file', '')
        if fname[0]:
            with open(fname[0],'r',encoding='gb18030',errors='ignore') as f:
                data = f.read()
                self.textEdit.setText(data)  
                #gb18030    简体中文字符编码 

颜色 字体 时间和日期

颜色 字体

调用类 QFontDialog QColorDialog等

from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame, 
    QColorDialog, QApplication,QFontDialog,QFont)
from PyQt5.QtGui import QColor
import sys
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
    	#设置按钮并关联函数
        self.bt1 = QPushButton('选择字体',self)
        self.bt1.move(350,70)
        self.bt2 = QPushButton('选择颜色',self)
        self.bt2.move(350,120)
        self.bt1.clicked.connect(self.choicefont)
        self.bt2.clicked.connect(self.choicecolor)
    def choicefont(self):       #FontDialog函数的运用   
        font, ok = QFontDialog.getFont() 
        if ok:
            self.tx.setCurrentFont(font)
    def choicecolor(self):
        col = QColorDialog.getColor()
        if col.isValid():
            self.tx.setTextColor(col)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

时间 日期

QDate QTime QDateTime
这QDate是一个在格里高利历中使用日历日期的类。它具有确定日期,比较或操纵日期的方法。该QTime课程以时钟时间工作。它提供了比较时间,确定时间和各种其他时间操纵方法的方法。这QDateTime是一个将两个 对象QDate和QTime对象组合成一个对象的类。

from PyQt5.QtWidgets import QMianWindow,QDate,QTime,QDateTime
class Example(QMainWindow):
    fileName='./newFile.txt'
    def __init__(self):
        super().__init__()
        
        self.initUI() 
    def initUI(self):
        self.textEdit = QTextEdit()
        self.setCentralWidget(self.textEdit)
        self.setGeometry(300, 300, 1500, 1200)         
        now=QDateTime.currentDateTime()
        self.textEdit.append(now.toString())
        date=QDate.currentDate()
        self.textEdit.apped(date.toString())
        time=QTime.currentTime()
        self.textEdit.append(time.toString())
    if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

控件

复选框

QCheckBox复选框控件,它有两个状态:打开和关闭,他是一个带有文本标签(Label)的控件。复选框常用于表示程序中可以启用或禁用的功能。

    def initUI(self):      

        cb = QCheckBox('Show title', self)#设置按钮
        cb.move(20, 20)#布局
        cb.toggle()
        cb.stateChanged.connect(self.changeTitle)#响应函数
    def changeTitle(self, state):

    if state == Qt.Checked:
        self.setWindowTitle('QCheckBox')
    else:
        self.setWindowTitle(' ')

下拉选框

QComboBox组件能让用户在多个选择项中选择一个。

    def initUI(self):      

        self.lbl = QLabel("Ubuntu", self)

        combo = QComboBox(self)#生成选框
        combo.addItem("Ubuntu")#加入选项
        combo.addItem("Mandriva")
        combo.addItem("Fedora")
        combo.addItem("Arch")
        combo.addItem("Gentoo")

        combo.move(50, 50)
        self.lbl.move(50, 150)

        combo.activated[str].connect(self.onActivated)        

切换按钮

QPushButton的一种特殊模式(多个按钮)。 它只有两种状态:按下和未按下。我们再点击的时候切换两种状态,有很多场景会使用到这个功能。

    def initUI(self):      

        self.col = QColor(0, 0, 0)       
#生成三个按钮,相互之间切换
        redb = QPushButton('Red', self)
        redb.setCheckable(True)
        redb.move(10, 10)

        redb.clicked[bool].connect(self.setColor)

        greenb = QPushButton('Green', self)
        greenb.setCheckable(True)
        greenb.move(10, 60)

        greenb.clicked[bool].connect(self.setColor)

        blueb = QPushButton('Blue', self)
        blueb.setCheckable(True)
        blueb.move(10, 110)

        blueb.clicked[bool].connect(self.setColor)

滑块

QSlider是个有一个小滑块的组件,这个小滑块能拖着前后滑动,这个经常用于修改一些具有范围的数值,比文本框或者点击增加减少的文本框(spin box)方便多了。音量标识也可用此。

    def initUI(self):      

        sld = QSlider(Qt.Horizontal, self)#生成滑块
        sld.setFocusPolicy(Qt.NoFocus)#设定滑块的聚焦模式
        sld.setGeometry(30, 40, 100, 30)
        sld.valueChanged.connect(self.changeValue)
    def changeValue(self, value):

        if value == 0:
            #自行添加动作
        elif value > 0 and value <= 30:
            
        elif value > 30 and value < 80:
            
        else:
            

图片编辑

QPixmap是处理图片的组件。

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):      

        hbox = QHBoxLayout(self)
        pixmap = QPixmap("redrock.png")#创建一个QPixmap对象,用pixmap接受

        lbl = QLabel(self)#创建标签
        lbl.setPixmap(pixmap)#将图片放入标签

        hbox.addWidget(lbl)#创建窗口
        self.setLayout(hbox)

        self.move(300, 200)
        self.setWindowTitle('Red Rock')
        self.show()        

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

行编辑

QLineEdit

qle = QLineEdit(self)
qle.textChanged.connect(self.onChanged)

文本编辑

QTextEdit

        self.textEdit = QTextEdit()
        self.setCentralWidget(self.textEdit)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值