简单一文入门PyQt5

1.PyQt5介绍

PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是最强大的库之一。PyQt是由Phil Thompson 开发。

PyQt实现了一个Python模块集。它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。 PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。

他们被分成几个模块。 QtCore模块包含核心的非GUI功能。该模块用于时间、文件和目录、各种数据类型、流、网址、MIME类型、线程或进程。QtGui模块包含图形组件和相关的类,例如按钮、窗体、状态栏、工具栏、滚动条、位图、颜色、字体等。QtNetwork模块包含了网络编程的类,这些类允许编写TCP/IP和UDP的客户端和服务器,他们使网络编程更简单,更轻便。QtXml包含使用XML文件的类,这个模块提供了SAX和DOM API的实现。QtSvg模块提供显示的SVG文件的类。可缩放矢量图形(SVG)是一种用于描述二维图形和图形应用程序的XML语言。QtOpenGL模块使用OpenGL库渲染3D和2D图形,该模块能够无缝集成Qt的GUI库和OpenGL库。QtSql模块提供用于数据库的类。

2.简单操作

import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication, QWidget

print(QT_VERSION_STR)						# 查看当前Pyqt版本号

if __name__ == '__main__':
    app = QApplication(sys.argv)            # Qt实例化一个app 必须有且只有一个 sys.argv一个列表是当前文件的名称元素
    w = QWidget()							# 创建窗口
    w.setWindowTitle("First PyQt")          # 设置窗口标题名称
    print(QT_VERSION_STR)                   # 获取版本号
    w.show()                                # 展示窗口
    app.exec()                              # 程序进入循环等待状态

3. QPushButton按钮

from PyQt5.QtWidgets import QPushButton

if __name__ == '__main__':
  app = QApplication(sys.argv)            # Qt实例化一个app 必须有且只有一个 sys.argv一个列表是当前文件的名称元素
  w = QWidget()                           # 创建的一个窗口

  w.setWindowTitle("First PyQt")          # 设置窗口标题名称
  btn = QPushButton("left Click")         # 在窗口里面添加控件
  btn.setParent(w)                        # 把当前按钮显示在W窗口 否则不会显示

  w.show()                                # 展示窗口
  app.exec()                              # 程序进入循环等待状态

4.QLabel纯文本

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

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    w.setWindowTitle('One Label')
    label = QLabel('Username: ', w)            # 创建一个纯文本Label 显示在W上面
    label.setGeometry(200, 200, 300, 300)      # 设置窗口大小
    w.show()
    app.exec()

5.QLineEdit输入框

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()

    w.setWindowTitle('one OLineEdit')

    user = QLabel('账号:', w)
    word = QLabel('密码:', w)
    user.setGeometry(20, 20, 30, 20)
    word.setGeometry(20, 50, 60, 20)

    edit1 = QLineEdit(w)												# 实例化输入框
    edit2 = QLineEdit(w)
    edit1.setPlaceholderText('请输入您的账号')			# 文本提示内容
    edit2.setPlaceholderText('请输入您的密码')
    edit1.setGeometry(55, 20, 200, 20)
    edit2.setGeometry(55, 50, 200, 20)

    btn = QPushButton('登录', w)
    btn.setGeometry(100, 80, 70, 30)

    w.show()
    app.exec()

6.设置窗口位置

from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()

    w.setWindowTitle('one OLineEdit')
    center_pointer = QDesktopWidget().availableGeometry().center()      # 调整窗口在屏幕正中间显示
   	# print(center_pointer)           	# PyQt5.QtCore.QPoint(742, 462)     
    x = center_pointer.x()
    y = center_pointer.y()
    # w.move(x-150, y-150)          	# 如果有设置窗口大小 需要减去xy一半的值 保证在中间
    
    # print(w.frameGeometry())                        # PyQt5.QtCore.QRect(0, 0, 640, 480)  依次																												是窗口位置 及窗口高宽
    # print(w.frameGeometry().getRect())              # (0, 0, 640, 480)
    # print(type(w.frameGeometry().getRect()))        # <class 'tuple'>	

    old_x, old_y, width, height = w.frameGeometry().getRect()
    w.move(x - width / 2, y - height / 2)				# 减去设置的窗口大小一般 居中

    w.show()
    app.exec()

7.修改窗口图标

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    w.setWindowTitle('setIcon')
    w.setWindowIcon(QIcon('111.png'))
    w.show()
    app.exec()

8.PyQt布局

在QT里面布局分为四个大类: QBoxLayout、QGridLayout、QFormLayout、QStackedLayOut
						  表格          网格			表单			抽屉式‘
						  
盒子布局分为两个子类 QHBoxLayOut 、 QVBoxLayOut 负责垂直和水平布局

1> 垂直布局

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()          # 调用父类的init方法

        self.resize(300, 300)       # 设置大小
        self.setWindowTitle('Vertical LayOut')      # 设置标题
        layout = QVBoxLayout()      # 创建垂直对象

        btn1 = QPushButton('No.1')  # 创建按钮添加到布局
        layout.addWidget(btn1)

        btn2 = QPushButton('NO.2')
        layout.addWidget(btn2)

        btn3 = QPushButton('NO.3')
        layout.addWidget(btn3)

        # layout.addStretch(2)       # 添加伸缩器 每一个按钮前加上一个则平均分配 如果不写也则也是平均分

        self.setLayout(layout)      # 让当前窗口使用当前排列规则布局


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

2> 水平布局

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QGroupBox, QRadioButton, QHBoxLayout


class MyWindow(QWidget):

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

    def init_ui(self):
        container = QVBoxLayout()       # 创建垂直布局

        hobby_box = QGroupBox('爱好')     # 分组
        v_layout = QVBoxLayout()
        btn1 = QRadioButton('抽烟')       # 添加单选框
        btn2 = QRadioButton('喝酒')
        btn3 = QRadioButton('烫头')

        v_layout.addWidget(btn1)         # 添加到布局中
        v_layout.addWidget(btn2)
        v_layout.addWidget(btn3)

        hobby_box.setLayout(v_layout)           # 容器使用当前V布局

        gender_box = QGroupBox('性别')
        h_layout = QHBoxLayout()

        btn4 = QRadioButton('boys')
        btn5 = QRadioButton('girls')
        btn6 = QRadioButton('gays')

        h_layout.addWidget(btn4)
        h_layout.addWidget(btn5)
        h_layout.addWidget(btn6)

        gender_box.setLayout(h_layout)          # 容器使用当前H布局

        container.addWidget(hobby_box)          # 把爱好添加到容器当中
        container.addWidget(gender_box)         # 把性别添加到容器当中

        self.setLayout(container)           	# 设置当前窗口显示容器内容


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

9.Pyqt简单登录

import time, json, sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi('./untitled1.ui')
        # print(self.ui)
        # print(self.ui.__dict__)     # 获取当前UI可使用的对象
        # print(self.ui.label.text())    # 获取Label内容
        self.username = self.ui.lineEdit
        self.password = self.ui.lineEdit_2
        self.login_btn = self.ui.pushButton
        self.forget_btn = self.ui.pushButton_2
        self.text = self.ui.textBrowser

        self.login_btn.clicked.connect(self.login)  	# 绑定信号与槽函数

        self.password.setEchoMode(QLineEdit.Password)  # 把当前密码设置成隐藏

    def login(self):
        username = self.username.text()
        password = self.password.text()

        for i in range(3):
            print('正在登录服务器...... %d' % (i + 1))
            time.sleep(1)

        if username == 'Like' and password == '123':
            self.text.setText('欢迎%s登录!' % username)
            self.text.repaint()
        else:
            self.text.setText('当前用户名密码错误!')
            self.text.repaint()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.ui.show()
    app.exec()

10.PyQt线程的使用

import sys
import time
from PyQt5 import uic

from PyQt5.Qt import QApplication, QWidget, QThread


class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(5):
            print('MyThread线程 %d 正在执行' % (i + 1))
            time.sleep(1)


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi('./untitled2.ui')
        print(self.ui.__dict__)

        text = self.ui.lineEdit
        btn1 = self.ui.pushButton
        btn2 = self.ui.pushButton_2

        btn1.clicked.connect(self.click_1)
        btn2.clicked.connect(self.click_2)

    def click_1(self):
        for i in range(5):
            print('CLick1线程%d' % (i + 1))
            time.sleep(1)

    def click_2(self):
        self.mythread = MyThread()      # 创建线程      不加self的话引用技数为0则会回收 就会报错
        self.mythread.start()           # 启动线程


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.ui.show()
    app.exec()

11.QtDiaLog

import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton


class MyDialog(QDialog):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        left_btn = QPushButton('Left', self)
        right_btn = QPushButton('right', self)

        left_btn.setGeometry(0, 0, 100, 30)
        right_btn.setGeometry(50, 50, 100, 30)

        self.setWindowTitle('对话框')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyDialog()
    w.show()
    app.exec()

12.QtMainWindow

import sys

from PyQt5.QtWidgets import QMainWindow, QLabel, QApplication


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        label = QLabel('This is Title')
        label.setStyleSheet("font-size:20px; color: red; background-color:pink;")

        menu = self.menuBar()
        menu.setNativeMenuBar(False)

        file_menu = menu.addMenu('File')                # 添加一级标题
        file_menu.addAction('New Object...')
        file_menu.addAction('save as')
        file_menu.addAction('Open')
        
        file_menu = menu.addMenu('Edit')     # 添加一级标题
        file_menu.addAction('Cut')
        file_menu.addAction('Copy')
        file_menu.addAction('Paste')

        label.setGeometry(200, 200, 300, 300,)
        
        self.setCentralWidget(label)        # 设置窗口在中心位置显示


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

13.QT自定义信号

import sys, time
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.Qt import pyqtSignal


class MyWindow(QWidget):
    signal = pyqtSignal(str)

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

    def init_ui(self):
        self.resize(300, 200)
        btn = QPushButton("开始检查", self)
        btn.setGeometry(0, 0, 200, 200)

        btn.clicked.connect(self.check)

        self.signal.connect(self.my_solt)

    def check(self):
        for i, ip in enumerate(['192.168.1.%d' % x for x in range(1, 255)]):
            msg = '正在检查 %s 上的漏洞' % ip
            print(msg)
            if i % 5 == 0:
                self.signal.emit(msg + 'Look One Bug')
            # else:
            #     self.signal.emit('')
            #     time.sleep(0.01)
 
    def my_solt(self, msg):
        print('>>>>', msg)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

猜你喜欢

转载自blog.csdn.net/MeiJin_/article/details/131132134