【python做个录屏软件】2.用PyQt5做个漂亮的GUI

耗尽温柔 提交于 2019-12-12 04:56:49

本篇内容包含:

1.PyQt5-手动书写GUI

2.无边框无标题栏界面

3.鼠标拖动

4.界面隐藏到桌面右边,靠近弹出。

1. GUI的模板

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class qt_window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        # 控件布局
        
        # 绑定信号和槽

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

继承一个QWidget,然后就可以写自己的界面了。

1.1 添加控件,绑定信号和槽

class qt_window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.press_start = True

        # 控件布局
        self.button_start_pause = QtWidgets.QPushButton(u"开始")
        self.button_stop = QtWidgets.QPushButton(u"结束")

        main_layout = QtWidgets.QHBoxLayout(self)
        main_layout.addWidget(self.button_start_pause)
        main_layout.addWidget(self.button_stop)
        self.setLayout(main_layout)

        # 绑定信号和槽
        self.button_start_pause.clicked.connect(self.start_pause)
        self.button_stop.clicked.connect(self.stop)

    def start_pause(self):
        if self.press_start:
            self.button_start_pause.setText('暂停')
            self.press_start = False
        else:
            self.button_start_pause.setText('开始')
            self.press_start = True

    def stop(self):
        exit(0)
  • QPushButton 按钮
    • 设定按钮名称
    • clicked是信号,代表这个按钮被按下
  • QHBoxLayout 水平布局
    • 将多个视图添加到布局中,水平分布
  • connect 连接信号和槽
    • clicked是信号,槽是自己写的函数
    • 连接之后,当按钮按下,就会进入自己写的函数之中

1.2 界面美化

  class qt_window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        # 控件布局
        # 绑定信号和槽
        # 界面美化
        style = """
            QPushButton {
                color: rgb(137, 221, 255);
                background-color: rgb(37, 121, 255);
                border-style:none;
                border:1px solid #3f3f3f; 
                padding:5px;
                min-height:20px;
                border-radius:15px;
            }
        """
        self.setStyleSheet(style)
        palette1 = QtGui.QPalette()
        palette1.setColor(self.backgroundRole(),
                          QtGui.QColor("#F8F8FF"))  # 设置背景颜色
        self.setPalette(palette1)
        self.setFixedSize(WINDOW_WEIGHT, WINDOW_HEIGHT)
     

通过QSS设定按钮样式

1.3 无边框无标题

        self.setWindowFlags(QtCore.Qt.FramelessWindowHint
                            | QtCore.Qt.WindowStaysOnTopHint
                            | QtCore.Qt.Tool)  # 去掉标题栏

2.鼠标拖动无边框无标题串口

  • mousePressEvent 重载鼠标按下函数

检测鼠标左键按下,得到抓取窗口的位置-dragPosition。 例如,窗口位置是(500,500)鼠标位置是(600,600)

dragPosition是(100,100),要得到这个是为了在Move函数中移动相应位置,具体效果可以自己修改试试。

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.dragPosition = event.globalPos() - self.frameGeometry(
            ).topLeft()
            QtWidgets.QApplication.postEvent(self, QEvent(174))
            event.accept()
  • mouseMoveEvent 重载鼠标移动函数

使用move函数移动当前窗口,之所以放在try块里面,使因为可能操作过快,还未得到dragPosition就执行Move了。

def mouseMoveEvent(self, event):
    if event.buttons() == Qt.LeftButton:
        try:
            self.move(event.globalPos() - self.dragPosition)
            event.accept()
        except:
            print('Error:Move before Press')
  • mouseReleaseEvent 重载鼠标释放函数

鼠标释放时的函数,这里为了让窗口隐藏到右边,判断当前位置是否在最右侧,如果是,就设置它的坐标。

def mouseReleaseEvent(self, event):
    pos = self.frameGeometry().topLeft()
    if pos.x() + WINDOW_WEIGHT > SCREEN_WEIGHT:  # 右侧隐藏
        self.move(QtCore.QPoint(SCREEN_WEIGHT - 2, pos.y()))
        self.is_hidden = True
        event.accept()
    else:
        self.is_hidden = False

3.自动隐藏,靠近弹出。 

需要重载QWidget的两个函数

  • enterEvent 鼠标移动到QWidget上时会进入这个函数

  • leaveEvent 鼠标离开时会进入这个函数

在这两个函数里面写应该隐藏和显示就好了。

效果图如下~

 https://github.com/Zweo/Video_Audio_Record

下一步就把录屏功能加到GUI里面把。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!