Zen的小站

小舟从此逝,江海寄余生

0%

【pyqt】编写可视化界面

python 库 pyqt,方便地设计 GUI

QT官网,里面找到python的,我还不是很会看官方文档

代码编写

核心思路

之前用过 pygame,再用 pyqt 感觉编程思路有很大不同

  1. 页面所有内容在一个 class 里,每项功能都要向上继承,进行修改

  2. 运行页面

    1
    2
    3
    4
    5
    6
    if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

入门示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Demo(QtWidgets):

def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.setWindowTitle("first")
self.resize(1600, 1400) # 设置窗口大小


if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())

外观样式

显示

1
2
3
4
5
6
7
8
9
10
11
# 设置:窗口无边框、窗口置顶、指定窗口类型为工具
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool)

# 设置窗口背景透明
self.setAttribute(Qt.WA_TranslucentBackground)

# 设置透明度(0~1)
self.setWindowOpacity(0.9)

# 设置鼠标为手状
self.setCursor(Qt.PointingHandCursor)

WindowFlags给窗口添加指定功能或属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Qt::CustomizeWindowHint          //关闭默认窗口标题提示 
Qt::WindowTitleHint //为窗口修饰一个标题栏
Qt::WindowSystemMenuHint //为窗口修饰一个窗口菜单系统
Qt::WindowMinimizeButtonHint //为窗口添加最小化按钮
Qt::WindowMaximizeButtonHint //为窗口添加最大化按钮
Qt::WindowMinMaxButtonsHint //为窗口添加最大化和最小化按钮
Qt::WindowCloseButtonHint //窗口只有一个关闭按钮
Qt::WindowContextHelpButtonHint
Qt::MacWindowToolBarButtonHint
Qt::WindowFullscreenButtonHint
Qt::BypassGraphicsProxyWidget
Qt::WindowShadeButtonHint
Qt::WindowStaysOnTopHint //总在最上面的窗口,置前
Qt::WindowStaysOnBottomHint
Qt::WindowOkButtonHint
Qt::WindowCancelButtonHint
Qt::WindowTransparentForInput

多个之间用 | 连接

形状位置修改

1
2
3
4
# (x,y)零点为左上角,方向为x右y下
self.resize(w,h) # 设置大小
self.move(x,y) # 设置位置
self.setGeometry(x,y,w,h) 同时设置位置和大小

设置样式

1
2
self.setStyleSheet("QLabel{font-size:25px;font-weight:normal;font-family:Microsoft JhengHei;}\
QWidget{background-color:#d6e0f6;}")

鼠标移动到组件上,显示悬浮提示框

1
self.setToolTip("1234")

添加右键菜单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
       # 声明在groupBox创建右键菜单
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.create_rightmenu) # 连接到菜单显示函数
self.contextMenu = QMenu(self)
self.actionA = self.contextMenu.addAction('关闭')
self.actionB = self.contextMenu.addAction('设置')
# 将动作与处理函数相关联
# 这里为了简单,将所有action与同一个处理函数相关联,
# 当然也可以将他们分别与不同函数关联,实现不同的功能
self.actionA.triggered.connect(self.actionHandlerA)
self.actionB.triggered.connect(self.actionHandlerB)

# 创建右键菜单函数
def create_rightmenu(self):
# 菜单对象
self.contextMenu.move(QtGui.QCursor().pos())
self.contextMenu.show()

def actionHandlerA(self):
os._exit(0)
def actionHandlerB(self):
print('设置')

将窗口嵌到win下方任务栏

1
import win32gui
1
2
3
4
5
6
7
8
9
m_hTaskbar = win32gui.FindWindow("Shell_TrayWnd", None)
m_hBar = win32gui.FindWindowEx(m_hTaskbar, 0, "ReBarWindow32", None)
m_hMin = win32gui.FindWindowEx(m_hBar, 0, "MSTaskSwWClass", None)

b = win32gui.GetWindowRect(m_hBar) # 获取m_hBar窗口尺寸b为[左,上,右,下]的数组
win32gui.MoveWindow(m_hMin, 0, 0, b[2] - b[0] - 200, b[3] - b[1], True)

self.setGeometry(b[2] - b[0] - 200, 0, 200, b[3] - b[1])
win32gui.SetParent(int(ui.winId()), m_hBar) # 设置任务栏为此窗口的父窗口

加入触发功能

触发功能的函数输入都要加 event

鼠标点击

1
2
3
4
def mousePressEvent(self, event):
if event.buttons() == PyQt5.QtCore.Qt.LeftButton: # 左键按下
s = event.windowPos()
print(s.x(), s.y())

绘制事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import * # QPainter QPixmap QPen
...
def paintEvent(self, event):
painter = QPainter(self) # 开启绘图

img = QPixmap('bitbug_favicon.ico')

painter.drawPixmap(0, 0, self.size, self.size, img) # 画图像

painter.setPen(QPen(Qt.red, 4))
painter.drawRect(QRect(0, 0, 200, 200))

self.update() # 不加这个不会更新

窗口关闭事件

1
2
3
4
5
6
7
8
9
10
11
def closeEvent(self, event):
reply = QMessageBox.question(self,
'quit',
"是否要退出",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.Yes)
if reply == QMessageBox.Yes:
self.close()
event.accept()
else:
event.ignore()

循环事件

用这个整循环时间的定时器最好

流程为:定义一个类,把类连接到主类的触发函数

1
from PyQt5.QtCore import pyqtSignal, QThread
1
2
3
4
5
6
7
8
9
10
11
12
13
class WorkThread(QThread):
# 实例化一个信号对象,类变量,需要定义在函数体外
trigger = pyqtSignal(str) # ql 这里的str需要修改为指定类型

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

def run(self):
# 重写QThread 的run 函数
while True:
# 信号发出通知面板更新
self.trigger.emit('qwer') # ql 传递数据
time.sleep(3) # ql 设置周期时间
1
2
3
4
5
6
    self.work = WorkThread()
self.work.start()
self.work.trigger.connect(self.display)

def display(self, str):
print('str')

其他

强制关闭窗口

只有这个最好用

1
os._exit(0)

ui编写

pyqt 有一个附加软件 qt designer ,可以用拖块方法设计gui,并且可以导出.ui 文件,再通过PYUIC转成 .py文件,可以被引用。

组件

都是QtWidgets的,必须加, self

QLabel标签

1
2
hello_label = QtWidgets.QLabel(hello_widget, self)    # 添加一个标签
hello_label.setText("hello wrold") # 设置标签文字

QTextEdit输入框

1
2
3
4
self.textEdit = QTextEdit("请看这里", self)					# 添加一个输入框
self.textEdit.setText("请输入") # 设置输入框文字
self.textEdit.setPlaceholderText('你不输入就一直显示这个') # 设置输入框背景文字
get_num = int(self.textEdit.toPlainText()) # 获取输入框文字

QPushButton按钮

1
2
self.button = QPushButton('请点点我', self)		# 添加按钮
self.button.clicked.connect(lambda: my_func()) # 按下按钮,将会执行my_func函数

QMessageBox提示框

1
2
msg_box = QMessageBox(QMessageBox.Warning, '警告', '请稍后再试')
msg_box.exec_()
1
2
3
4
5
reply = QMessageBox.question(self,
'quit',
"是否要保存",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)

QFileDialog对话框

选择文件,注意分隔两种类型文件需要用 ;;

1
self.filelist = QFileDialog.getOpenFileNames(self, "多文件选择", "/", "所有文件 (*);;文本文件 (*.txt)")[0]

QProgressbar进度条

QSlider滑动条

1

引用布局

主要就是 QWidget 嵌进去,方法有很多

  1. 类初始化那部分全改掉

    1
    2
    3
    4
    class Ui_Dialog(QWidget):
    def __init__(self,parent=None):
    super(Ui_Dialog, self).__init__(parent)
    self.setupUi(self)

    引用类时直接

    1
    2
    3
    4
    5
    6
    if __name__=="__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    ui = Ui_Dialog()
    ui.show()
    sys.exit(app.exec_())
  2. 新建文件 import 他

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import sys
    #从转换的.py文件内调用类
    from FirstMainWin import Ui_MainWindow
    from PyQt5 import QtWidgets


    class myWin(QtWidgets.QWidget, Ui_MainWindow):

    def __init__(self):
    super(myWin, self).__init__()
    self.setupUi(self)


    if __name__=="__main__":

    app=QtWidgets.QApplication(sys.argv)
    Widget=myWin()
    Widget.show()
    sys.exit(app.exec_())
  3. 在底部这样引用类

    1
    2
    3
    4
    5
    6
    7
    8
    if __name__=="__main__":  
    import sys
    app = QtWidgets.QApplication(sys.argv)
    widget = QtWidgets.QWidget()
    ui = Ui_MainWindow()
    ui.setupUi(widget)
    widget.show()
    sys.exit(app.exec_())

多想多做,发篇一作

-------------本文结束感谢您的阅读-------------
// 在最后添加