pyqt5

基础

from PyQt5 import QtCore, QtGui, QtWidgets
from Ui_apaki_crypto import Ui_Apaki

# ----------------------------------------
# test.ui时Designer配置好的
# 这仅仅是个框架,有些功能其实未实现
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    widget = QtWidgets.QWidget(None)
    Ui_Apaki().setupUi(widget)
    widget.show()
    sys.exit(app.exec_())
    pass

信号槽


"""
# 方式1
import sys
from PyQt5.QtWidgets import QApplication,QWidget


if __name__ == '__main__':
    # 必须创建应用对象
    app = QApplication(sys.argv)

    # QWidget是PyQt5所有界面类的基础类
    w = QWidget()
    w.setWindowTitle('QWidget')
    w.resize(400, 300)
    w.show()

    sys.exit(app.exec_())
"""


import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QToolTip, QPushButton,
                             QMessageBox, QDesktopWidget, QFrame)
from PyQt5.QtGui import QIcon, QFont, QColor
from PyQt5.QtCore import QCoreApplication, qrand, qsrand, QTime


class Windows(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()
        time = QTime(0, 0, 0).secsTo(QTime.currentTime())
        qsrand(time)

    def initUI(self):
        self.setWindowTitle('Apaki示例')
        self.setWindowIcon(QIcon('./res/apaki.ico'))
        self.setGeometry(400, 300, 400, 300)
        # 设置窗口居中显示到屏幕中心处
        # self.center()

        QToolTip.setFont(QFont('宋体', 10))
        self.setToolTip('Apaki界面示例')

        exitBt = QPushButton('退出', self)
        exitBt.setFont(QFont('华文行楷', 12))
        exitBt.setToolTip('按下按键,退出程序')
        exitBt.resize(exitBt.sizeHint())
        exitBt.move(300, 250)
        # 信号槽:退出
        exitBt.clicked.connect(QCoreApplication.instance().quit)

        self.font = QFont('华文行楷', 12)
        confirmBt = QPushButton("确认", self)
        confirmBt.setFont(self.font)
        confirmBt.setToolTip('按下随机,弹起黑色')
        confirmBt.move(300, 200)

        confirmBt.setCheckable(True)
        confirmBt.clicked[bool].connect(self.confirmBtEvent)

        aboutBt = QPushButton("关于", self)
        aboutBt.setFont(self.font)
        aboutBt.setToolTip('显示程序相关信息')
        aboutBt.move(300, 150)
        aboutBt.clicked.connect(self.aboutEvent)

        self.color = QColor(0, 0, 0)
        self.frame = QFrame(self)
        self.frame.setGeometry(30, 30, 200, 200)
        self.frame.setStyleSheet("QWidget { background-color: %s }" %
                                 self.color.name())

    def aboutEvent(self, event):
        QMessageBox.about(self, '关于',
                                '时间:2018.11.15\n作者:jianfeng\n'
                                '版本:v1.0.00')

    def center(self):
        """
            将窗口放置在屏幕正中央的一种方式
        """
        # 获取主窗口的一个特定矩形
        qr = self.frameGeometry()
        # 计算出显示器的绝对值并从这个绝对值中我们获得屏幕的中心点
        cp = QDesktopWidget().availableGeometry().center()
        # 将矩形的中心设置到屏幕中心处。
        qr.moveCenter(cp)
        # 移动了应用窗口的左上方的点到qr矩形的左上方的点
        self.move(qr.topLeft())

    def closeEvent(self, event):
        """
            通过窗口右上角进行关闭时
        """
        reply = QMessageBox.question(self, '退出程序',
                                     '请确认是否退出?',
                                     QMessageBox.Yes | QMessageBox.No,
                                     # 最后这个参数表示是初始焦点位置(若无该参数,则默认是Yes)
                                     QMessageBox.Yes)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    def confirmBtEvent(self, pressed):
        # print('pressed', pressed)
        if not pressed:
            value = 0
            self.color.setRgb(value, value, value)
        else:
            r = qrand() % 256
            g = qrand() % 256
            b = qrand() % 256
            self.color.setRgb(r, g, b)

        self.frame.setStyleSheet("QWidget { background-color: %s }" %
                                 self.color.name())

if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = Windows()
    w.show()

    sys.exit(app.exec_())

进度条

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QFrame, QGridLayout,
                             QProgressBar, QPushButton, QCalendarWidget,
                             QLabel)
from PyQt5.QtGui import QIcon, QFont, QColor
from PyQt5.QtCore import Qt, QBasicTimer, QDate

"""
    进度条的应用
    感谢:Archi - 高手成长之路
    参考来源:https://www.cnblogs.com/archisama/p/5465104.html
"""


class Windows(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()
        self.finished = False

    def initUI(self):
        self.setWindowTitle('进度条示例')
        self.setWindowIcon(QIcon('./res/apaki.ico'))
        self.setGeometry(400, 300, 400, 300)

        self.pbar = QProgressBar(self)
        self.btn = QPushButton("开始下载", self)
        self.btn.clicked.connect(self.doAction)

        self.timer = QBasicTimer()
        self.step = 0

        # -------------------------------------------------
        cal = QCalendarWidget(self)
        cal.clicked[QDate].connect(self.showData)

        date = cal.selectedDate()
        self.label = QLabel(self)
        self.label.setText(date.toString())

        grid = QGridLayout(self)
        grid.addWidget(self.pbar, 0, 1)
        grid.addWidget(self.btn, 0, 0)
        grid.addWidget(self.label, 2, 0, 1, 2)
        grid.addWidget(cal, 3, 0, 1, 2)
        self.setLayout(grid)

    def timerEvent(self, event):
        if self.step >= 100:
            self.timer.stop()
            self.btn.setText('下载完成')
            self.finished = True
            return

        self.step += 1
        self.pbar.setValue(self.step)

    def doAction(self):
        if self.finished is not True:
            if self.timer.isActive():
                self.timer.stop()
                self.btn.setText('继续')
            else:
                self.timer.start(100, self)
                self.btn.setText('停止')

    def showData(self, date):
        self.label.setText(date.toString())


if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = Windows()
    w.show()

    sys.exit(app.exec_())

图像

import os
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog,
                             QVBoxLayout, QHBoxLayout, QLineEdit, QLabel)
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import Qt
"""
    进度条的应用
    感谢:Archi - 高手成长之路
    参考来源:https://www.cnblogs.com/archisama/p/5465104.html
"""
class Windows(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.finished = False

    def initUI(self):
        self.setWindowTitle('图像显示示例')
        self.setWindowIcon(QIcon('./res/apaki.ico'))
        self.setGeometry(400, 300, 400, 300)

        # 打开按键
        self.fileBtn = QPushButton('打开图像', self)
        self.fileBtn.clicked.connect(self.showfileDialog)

        # 路径显示
        self.lineEidt = QLineEdit(self)

        # 图像显示
        self.label = QLabel(self)

        hbox = QHBoxLayout()
        hbox.addWidget(self.fileBtn)
        hbox.addWidget(self.lineEidt)
        vbox = QVBoxLayout()
        vbox.addItem(hbox)
        vbox.addWidget(self.label)
        self.setLayout(vbox)

    def showfileDialog(self):
        # 弹出文本框选择框
        imagefname = QFileDialog.getOpenFileName(self,
                                                 '选择文件',
                                                 './',
                                                 filter='图像 (*.jpg *.png *.bmp)')
        file_path = imagefname[0]
        self.lineEidt.setText(file_path)
        pixmap = QPixmap(file_path)
        self.label.setPixmap(pixmap)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Return:
            file_path = self.lineEidt.text()
            if os.path.exists(file_path):
                # print(file_path)
                pixmap = QPixmap(file_path)
                self.label.setPixmap(pixmap)
            else:
                self.label.setText('文件不存在')

if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = Windows()
    w.show()

    sys.exit(app.exec_())

窗口

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

icon_exit = './images/exit.png'
class Windows(QMainWindow):
    def __init__(self):
        super().__init__()

        self.statusBar().showMessage('欢迎来到英雄联盟...(^.^)')
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Apaki示例')
        self.setWindowIcon(QIcon('./res/apaki.ico'))
        self.setGeometry(400, 300, 800, 600)

        # 没有可用图标,就临时顶上了(^.^)
        exitAction = QAction(QIcon(icon_exit), '&退出', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('退出程序')
        # 信号触发
        exitAction.triggered.connect(qApp.quit)

        # 菜单栏
        menubar = self.menuBar()
        menubar.setStatusTip('菜单栏')
        fileMenu = menubar.addMenu('&文件')
        fileMenu.addAction(exitAction)

        # 工具栏
        toolbar = self.addToolBar('Exit')
        toolbar.setStatusTip('工具栏')
        toolbar.setWindowIcon(QIcon(icon_exit))
        toolbar.addAction(exitAction)

        # 添加文本框组件,将其配置为QMainWindow的中心组件
        textEdit = QTextEdit()
        textEdit.setStatusTip('文本框')
        self.setCentralWidget(textEdit)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = Windows()
    w.show()

    sys.exit(app.exec_())

布局

示例1

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QToolTip, QPushButton,
                             QMessageBox, QDesktopWidget, QVBoxLayout,
                             QHBoxLayout)
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QCoreApplication

"""
    箱布局
"""
class Windows(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setWindowTitle('Apaki示例')
        self.setWindowIcon(QIcon('./res/apaki.ico'))
        self.setGeometry(400, 300, 400, 300)
        font = QFont('华文行楷', 12)

        QToolTip.setFont(QFont('楷体', 10))
        self.setToolTip('Apaki界面示例')

        # 退出Button
        exitBt = QPushButton('退出', self)
        exitBt.setFont(font)
        exitBt.setToolTip('按下按键,退出程序')
        exitBt.resize(exitBt.sizeHint())
        exitBt.clicked.connect(QCoreApplication.instance().quit)

        # 确认Button
        confirmBt = QPushButton("确认", self)
        confirmBt.setFont(font)
        confirmBt.setToolTip('按下按键,暂时无效')

        # 关于Button
        aboutBt = QPushButton("关于", self)
        aboutBt.setFont(font)
        aboutBt.setToolTip('显示程序相关信息')
        aboutBt.clicked.connect(self.aboutEvent)


        # 0003_PyQt5_Layout.py重点
        hbox = QHBoxLayout()
        # 我的理解2018.11.06
        # 添加拉伸因子,若没有addStretch,则横向均分空白
        # 若添加拉伸因子,其参数表示空白区域均分占比
        hbox.addStretch(9)
        hbox.addWidget(aboutBt)
        hbox.addWidget(confirmBt)
        hbox.addWidget(exitBt)
        hbox.addStretch(1)    #2.1

        # 将水平布局箱放在垂直布局内,从而实现整个我们想要的右下脚效果
        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addItem(hbox)

        # 配置“箱布局”
        self.setLayout(vbox)

    def aboutEvent(self, event):
        QMessageBox.about(self, '关于',
                                '时间:2018.11.15\n作者:jianfeng\n'
                                '版本:v1.0.00')

if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = Windows()
    w.show()

    sys.exit(app.exec_())

示例2


import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout, QPushButton,
                             QLineEdit)
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt

"""
    网络布局
"""


class Windows(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Apaki计算器框架')
        self.setWindowIcon(QIcon('./res/apaki.ico'))
        self.setGeometry(400, 300, 400, 300)

        grid = QGridLayout()
        self.setLayout(grid)

        LineEdit = QLineEdit(self)
        LineEdit.setAlignment(Qt.AlignRight)
        grid.setSpacing(10)
        grid.addWidget(LineEdit, 0, 0, 1, 4)

        names = ['C', 'DEL', '', '=',
                 '7', '8', '9', '/',
                 '4', '5', '6', '*',
                 '1', '2', '3', '-',
                 '±', '0', '.', '+']
        positions = [(i, j) for i in range(1, 6) for j in range(4)]

        for position, name in zip(positions, names):
            if name == '':
                continue
            button = QPushButton(name)
            grid.addWidget(button, *position)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = Windows()
    w.show()

    sys.exit(app.exec_())

信号

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLCDNumber,
                             QSlider, QVBoxLayout, QHBoxLayout,
                             QPushButton)
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QObject, pyqtSignal

"""
    信号
"""

class Communicate(QObject):
    """
        创建一个新的信号叫做closeApp
        信号使用了pyqtSignal()方法创建,并且成为外部类Communicate类的属性。
    """
    closeApp = pyqtSignal()


class Windows(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Apaki 显示进度')
        self.setWindowIcon(QIcon('./res/apaki.ico'))
        self.setGeometry(400, 300, 300, 200)

        lcd = QLCDNumber(self)
        lcd.setDigitCount(3)

        self.max_num = 255
        self.slider = QSlider(Qt.Horizontal, self)
        self.slider.setMaximum(self.max_num)

        maxBt = QPushButton('最大值', self)
        minBt = QPushButton("最小值", self)
        # 两个按钮连接到同一个事件
        maxBt.clicked.connect(self.buttonClicked)
        minBt.clicked.connect(self.buttonClicked)

        hbox = QHBoxLayout()
        hbox.addWidget(minBt)
        hbox.addWidget(maxBt)

        vbox = QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(self.slider)
        vbox.addLayout(hbox)
        self.setLayout(vbox)

        self.slider.valueChanged.connect(lcd.display)

        # 把自定义的closeApp信号连接到QMainWindow的close()槽上。
        self.custom = Communicate()
        self.custom.closeApp.connect(self.close)

    def keyPressEvent(self, event):
        """
            重写事件函数
        """
        if event.key() == Qt.Key_Escape:
            self.close()

    def buttonClicked(self):
        """
            事件发送者
        """
        sender = self.sender()
        if sender.text() == '最大值':
            self.slider.setValue(self.max_num)
        elif sender.text() == '最小值':
            self.slider.setValue(0)
        else:
            pass

    def mousePressEvent(self, event):
        """
            触发鼠标点击事件时,自定义信号closeApp会被发射
            现在在窗口非点击组件上单击一下,则会退出
        """
        self.custom.closeApp.emit()


if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = Windows()
    w.show()

    sys.exit(app.exec_())

对话框

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QInputDialog,
                             QLineEdit, QGridLayout,
                             QColorDialog, QFrame, QFontDialog, QFileDialog,
                             QTextEdit, QCheckBox, QComboBox, QLabel)
from PyQt5.QtGui import QIcon, QFont, QColor
from PyQt5.QtCore import QCoreApplication, Qt


class Windows(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setWindowTitle('Apaki示例')
        self.setWindowIcon(QIcon('./res/apaki.ico'))
        self.setGeometry(400, 300, 400, 300)

        # ---------------------------------------------------
        self.DialogBtn = QPushButton('输入对话框', self)
        self.DialogBtn.clicked.connect(self.showDialog)

        self.lineEdit = QLineEdit(self)
        self.lineEdit.setAlignment(Qt.AlignRight)

        # ---------------------------------------------------
        self.colorBtn = QPushButton('颜色对话框', self)
        self.colorBtn.clicked.connect(self.showcolorDialog)

        # QFrame组件的背景设置为黑色
        color = QColor(0, 0, 0)
        self.frm = QFrame(self)
        self.frm.setStyleSheet(
            'QWidget { background-color: %s}' % color.name())

        # --------------------------------------------------
        self.fontBtn = QPushButton('字体对话框', self)
        self.fontBtn.clicked.connect(self.showfontDialog)

        # --------------------------------------------------
        self.fileBtn = QPushButton('文件对话框', self)
        self.fileBtn.clicked.connect(self.showfileDialog)

        self.textEdit = QTextEdit(self)

        # --------------------------------------------------
        checkbox = QCheckBox('切换标题', self)
        checkbox.stateChanged.connect(self.changeTitle)

        # --------------------------------------------------
        combo = QComboBox(self)
        cars = ['雷克萨斯', '宝马', '梅赛德斯', '宾利', '保时捷', '玛莎拉蒂', '兰博基尼', '法拉利',
                '凯迪拉克', '别克', '劳斯莱斯', '大众', '奥迪', '名爵', '铃木', '本田', '现代',
                '丰田', '欧宝', '悍马', '吉普', '布加迪', '红旗', '五菱', '双环', '水星',
                '福特', '通用', '吉利', '雪佛兰', '斯巴鲁', '捷豹', '道奇', '日产', '马自达',
                '雪铁龙', '英菲尼迪', '全球鹰', '林肯']
        cars.sort()
        for car in cars:
            combo.addItem(car)
        combo.activated[str].connect(self.onActived)
        self.label = QLabel(self)
        self.label.setText(combo.itemText(0))
        self.label.setFont(QFont('华文行楷', 14))

        # 布局
        grid = QGridLayout()
        self.setLayout(grid)
        grid.addWidget(self.DialogBtn, 0, 0)
        grid.addWidget(self.lineEdit, 0, 1)
        grid.addWidget(self.colorBtn, 1, 0)
        grid.addWidget(self.frm, 1, 1)
        grid.addWidget(self.fontBtn, 2, 0)
        grid.addWidget(self.fileBtn, 3, 0)
        grid.addWidget(self.textEdit, 3, 1, 10, 1)
        grid.addWidget(checkbox, 5, 0)
        grid.addWidget(combo, 7, 0)
        grid.addWidget(self.label, 10, 0)

    def showDialog(self):
        text, ok = QInputDialog.getText(self, '对话框', '请输入你的名字')
        if ok:
            self.lineEdit.setText(str(text))

    def showcolorDialog(self):
        # 弹出颜色选择框
        color = QColorDialog.getColor()

        if color.isValid():
            self.frm.setStyleSheet(
                'QWidget { background-color: %s}' % color.name())

    def showfontDialog(self):
        # 弹出字体选择框
        font, ok = QFontDialog.getFont()
        if ok:
            self.lineEdit.setFont(font)
            self.textEdit.setFont(font)

    def showfileDialog(self):
        # 弹出文本框选择框
        fname = QFileDialog.getOpenFileName(
            self, '打开文件', filter='Markdown(*.md);;Text(*.txt);;All(*.*)')
        if fname[0]:
            f = open(fname[0], 'r', encoding='utf-8')
            with f:
                data = f.read()
                self.textEdit.setText(data)

    def changeTitle(self, status):
        if status == Qt.Checked:
            self.setWindowTitle('复选框选中')
        else:
            self.setWindowTitle('Apaki示例')

    def onActived(self, text):
        self.label.setText(text)
        self.label.adjustSize()


if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = Windows()
    w.show()

    sys.exit(app.exec_())