QT官网,里面找到python的,我还不是很会看官方文档
代码编写
核心思路
之前用过 pygame,再用 pyqt 感觉编程思路有很大不同
页面所有内容在一个 class 里,每项功能都要向上继承,进行修改
运行页面
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)
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
| 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.create_rightmenu) self.contextMenu = QMenu(self) self.actionA = self.contextMenu.addAction('关闭') self.actionB = self.contextMenu.addAction('设置') 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 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) 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 * ... 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)
def __init__(self): super().__init__()
def run(self): while True: self.trigger.emit('qwer') time.sleep(3)
|
1 2 3 4 5 6
| self.work = WorkThread() self.work.start() self.work.trigger.connect(self.display)
def display(self, str): print('str')
|
其他
强制关闭窗口
只有这个最好用
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())
|
1 2
| self.button = QPushButton('请点点我', self) self.button.clicked.connect(lambda: 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滑动条
引用布局
主要就是 QWidget 嵌进去,方法有很多
类初始化那部分全改掉
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_())
|
新建文件 import 他
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import sys
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_())
|
在底部这样引用类
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_())
|
多想多做,发篇一作