Python:学习笔记之PyQt5
发布日期:2021-06-30 15:42:09
浏览次数:2
分类:技术文章
本文共 42249 字,大约阅读时间需要 140 分钟。
补一下之前PyQt敲的代码作为笔记
简单的窗口
import sysfrom PyQt5.QtWidgets import QApplication, QWidget# 这句代码的作用是判断当前文件是否为主文件# 如果不是主文件,则其下面的内容不被执行if __name__ == '__main__': #创建应用对象 app = QApplication(sys.argv) # QWidge控件是一个用户界面的基本控件,它提供了基本的应用构造器。 # 默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口(window)。 w = QWidget() # resize()方法改变窗口大小,宽度500,高度300 w.resize(250, 150) # 设置窗口位置(针对屏幕左上角) w.move(300, 300) # 给窗口添加标题 w.setWindowTitle('simple') # 显示 w.show() # sys.exit()方法能确保主循环安全退出。外部环境能通知主控件怎么结束。 sys.exit(app.exec_())
带图标的窗口
import sysfrom PyQt5.QtWidgets import QApplication, QWidgetfrom PyQt5.QtGui import QIcon# 面向对象编程最重要的三个部分是类(class)、数据和方法。# 我们创建了一个类的调用,这个类继承自QWidget。# 这就意味着,我们调用了两个构造器,一个是这个类本身的,一个是这个类继承的。# super()构造器方法返回父级的对象。__init__()方法是构造器的一个方法。# 构造器作为一种方法,负责类中成员变量(域)的初始化class Example(QWidget): def __init__(self): super().__init__() # 使用init_ui()方法创建一个GUI self.init_ui() def init_ui(self): """ setGeometry() 把窗口放到屏幕上并且设置窗口大小。 参数分别代表屏幕坐标的x、y和窗口大小的宽、高。 也就是说这个方法是resize()和move()的合体。 """ self.setGeometry(300, 300, 300, 220) self.setWindowTitle('Icon') # 添加图标 # 先创建一个QIcon对象,接收一个路径作为参数显示图标 self.setWindowIcon(QIcon('web.png')) self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
提示窗
import sysfrom PyQt5.QtWidgets import QWidget, QToolTip, QPushButton, QApplicationfrom PyQt5.QtGui import QFontclass Example(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): # 为应用创建一个提示框 # 设置提示框的字体,使用10px的SansSerif字体 QToolTip.setFont(QFont('SansSerif', 10)) # 调用setToolTip()创建提示框可以使用富文本格式的内容 self.setToolTip('This is a QWidget widget') # 创建一个按钮,并且为按钮添加了一个提示框 btn = QPushButton('Button',self) btn.setToolTip('This is a QPushButton widget') # 调整按钮的宽度,并让按钮再屏幕上显示出来 # sizeHint()方法提供了一个默认的按钮大小。 btn.resize(btn.sizeHint()) btn.move(50, 50) self.setGeometry(300, 300, 300, 300) self.setWindowTitle('Tooltips') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())#关闭窗口
# 创建一个点击之后就退出窗口的按钮import sysfrom PyQt5.QtWidgets import QWidget, QPushButton, QApplication# 需要QtCore对象from PyQt5.QtCore import QCoreApplicationclass Example(QWidget): def __init__(self) : super().__init__() self.init_ui() def init_ui(self): """ 创建一个继承自QPushButton的按钮。 第一个参数是按钮的文本,第二个参数是按钮的父级组件, 这个例子中,父级组件就是我们创建的继承自Qwidget的Example类。 """ qbtn = QPushButton('Quit',self) qbtn.clicked.connect(QCoreApplication.instance().quit) # resize设置控件的宽和高 qbtn.resize(250, 150) qbtn.move(50, 50) self.setGeometry(300, 300, 500, 300) self.setWindowTitle('Quit Button') self.show() """ 事件传递系统在PyQt5内建的single和slot机制里面。 点击按钮之后,信号会被捕捉并给出既定的反应。 QCoreApplication包含了事件的主循环,它能添加和删除所有的事件, instance()创建了一个它的实例。 QCoreApplication是在QApplication里创建的。 点击事件和能终止进程并退出应用的quit函数绑定在了一起。 在发送者和接受者之间建立了通讯,发送者就是按钮,接受者就是应用对象。"""if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
消息盒子
import sysfrom PyQt5.QtWidgets import QWidget, QMessageBox, QApplication"""如果关闭QWidget,就会产生一个QCloseEvent,并且把它传入到closeEvent函数的event参数中。改变控件的默认行为,就是替换掉默认的事件处理。"""class Example(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Message box') self.show() def closeEvent(self, event): """ 我们创建了一个消息框,上面有俩按钮:Yes和No. 第一个字符串显示在消息框的标题栏, 第二个字符串显示在对话框, 第三个参数是消息框的俩按钮, 最后一个参数是默认按钮,这个按钮是默认选中的。 返回值在变量reply里。 """ reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) # 这里判断返回值,如果点击的是Yes按钮,我们就关闭组件和应用,否者就忽略关闭事件。 if reply == QMessageBox.Yes: event.accept() else: event.ignore()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
窗口居中
import sysfrom PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication# QtGui.QDesktopWidget提供了用户的桌面信息,包括屏幕的大小。class Example(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.resize(250, 150) # 这个方法是调用我们下面写的,实现对话框居中的方法。 self.center() self.setWindowTitle('Center') self.show() def center(self): # 获得主窗口所在的框架。 qr = self.frameGeometry() # 获取显示器的分辨率,然后得到屏幕中间点的位置。 cp = QDesktopWidget().availableGeometry().center() # 然后通过move函数把主窗口的左上角移动到其框架的左上角,这样就把窗口居中了。 qr.moveCenter(cp) self.move(qr.topLeft())if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
屏幕居中
状态栏
import sysfrom PyQt5.QtWidgets import QMainWindow, QApplication#状态栏是由QMainWindow创建的class Example(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): # 调用QtGui.QMainWindow类的statusBar()方法,创建状态栏。 # 第一次调用创建一个状态栏,返回一个状态栏对象。 # showMessage()方法在状态栏上显示一条信息。 self.statusBar`在这里插入代码片`().showMessage('Ready') self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Statusbar') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
菜单栏
import sysfrom PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qAppfrom PyQt5.QtGui import QIcon"""我们创建了只有一个命令的菜单栏,这个命令就是终止应用同时也创建了一个状态栏。而且还能使用快捷键Ctrl+Q退出应用。"""class Example(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): """ QAction是菜单栏、工具栏或者快捷键的动作的组合。 前面两行,我们创建了一个图标、一个exit的标签和一个快捷键组合,都执行了一个动作。 第三行,创建了一个状态栏,当鼠标悬停在菜单栏的时候,能显示当前状态。 """ exitAct = QAction(QIcon('quit.png'), '&Exit', self) exitAct.setShortcut('Ctrl+Q') exitAct.setStatusTip('Exit Application') # 当执行这个指定的动作时,就触发了一个事件。 # 这个事件跟QApplication的quit()行为相关联,所以这个动作就能终止这个应用。 exitAct.triggered.connect(qApp.quit) self.statusBar() # menuBar()创建菜单栏。 # 这里创建了一个菜单栏,并在上面添加了一个file菜单,并关联了点击退出应用的事件。 menubar = self.menuBar() fileMenu = menubar.addMenu('&File') fileMenu.addAction(exitAct) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Simple menu') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
子菜单
import sysfrom PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication# 这个例子里,有两个子菜单,一个在file菜单下面,一个在file的import下面。class Example(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): menubar = self.menuBar() fileMenu = menubar.addMenu('File') # 使用QMenu创建一个新菜单。 impMenu = QMenu('Import', self) impAct = QAction('Import mail', self) # 使用addAction添加一个动作。 impMenu.addAction(impAct) newAct = QAction('New', self) fileMenu.addAction(newAct) fileMenu.addMenu(impMenu) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Submenu') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
勾选菜单
import sysfrom PyQt5.QtWidgets import QMainWindow, QAction, QApplication# 本例创建了一个行为菜单。这个行为/动作能切换状态栏显示或者隐藏。class Example(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.statusbar = self.statusBar() self.statusbar.showMessage('Ready') menubar = self.menuBar() # 用checkable选项创建一个能选中的菜单。 viewMenu = menubar.addMenu('View') # viewMenu2 = menubar.addMenu('View2') 可以参加第二个菜单 viewStatAct = QAction('View statusbar', self, checkable=True) viewStatAct.setStatusTip('View statusbar') # 默认设置为选中状态。 viewStatAct.setChecked(True) viewStatAct.triggered.connect(self.toggleMenu) viewMenu.addAction(viewStatAct) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Check menu') self.show() def toggleMenu(self, state): # 依据选中状态切换状态栏的显示与否。 if state: self.statusbar.show() else: self.statusbar.hide()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
右键菜单
import sysfrom PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplication# 使用contextMenuEvent()方法实现这个菜单。class Example(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Context menu') self.show() def contextMenuEvent(self, event): # QMenu创建菜单 cmenu = QMenu(self) newAct = cmenu.addAction("New") opnAct = cmenu.addAction("Open") quitAct = cmenu.addAction("Quit") # 使用exec_()方法显示菜单。从鼠标右键事件对象中获得当前坐标。 # mapToGlobal()方法把当前组件的相对坐标转换为窗口(window)的绝对坐标。 action = cmenu.exec_(self.mapToGlobal(event.pos())) # 如果右键菜单里触发了事件,也就触发了退出事件,执行关闭菜单行为。 if action == quitAct: qApp.quit()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
工具栏
import sysfrom PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplicationfrom PyQt5.QtGui import QIcon# 创建了一个工具栏。这个工具栏只有一个退出应用的动作。class Example(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): exitAct = QAction(QIcon('quit(2).png'), 'Exit', self) exitAct.setShortcut('Ctrl+Q') exitAct.triggered.connect(qApp.quit) self.toolbar = self.addToolBar('Exit') self.toolbar.addAction(exitAct) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Toolbar') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
主窗口
import sysfrom PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplicationfrom PyQt5.QtGui import QIconclass Example(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): textEdit = QTextEdit() self.setCentralWidget(textEdit) exitAct = QAction(QIcon('quit(2).png'), 'Exit', self) exitAct.setShortcut('Ctrl+Q') # 设置状态栏 exitAct.setStatusTip('Exit application') exitAct.triggered.connect(self.close) self.statusBar() menubar = self.menuBar() fileMenu = menubar.addMenu('&File') fileMenu.addAction(exitAct) toolbar = self.addToolBar('Exit') toolbar.addAction(exitAct) self.setGeometry(300, 300, 350, 250) self.setWindowTitle('Main window') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
绝对定位
import sysfrom PyQt5.QtWidgets import QWidget, QLabel, QApplication# 我们使用move()方法定位了每一个元素,使用x、y坐标。x、y坐标的原点是程序的左上角。class Example(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): # 这个元素的左上角就在这个程序的左上角开始的(15, 10)的位置。 lbl1 = QLabel('Zetcode', self) lbl1.move(15, 10) lbl2 = QLabel('tutorials', self) lbl2.move(35, 40) lbl3 = QLabel('for programmers', self) lbl3.move(55, 70) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Absolute') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
盒布局
import sysfrom PyQt5.QtWidgets import (QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QApplication)# 上面的例子完成了在应用的右下角放了两个按钮的需求。# 当改变窗口大小的时候,它们能依然保持在相对的位置。# 我们同时使用了QHBoxLayout和QVBoxLayout。class Example(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): # 这是创建了两个按钮。 okButton = QPushButton("OK") cancelButton = QPushButton("Cancel") # 创建一个水平布局,增加两个按钮和弹性空间。 # stretch函数在两个按钮前面增加了一些弹性空间。 # 下一步我们把这些元素放在应用的右下角。 hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(okButton) hbox.addWidget(cancelButton) # 为了布局需要,我们把这个水平布局放到了一个垂直布局盒里面。 # 弹性元素会把所有的元素一起都放置在应用的右下角。 vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300, 300, 300, 150) self.setWindowTitle('Buttons') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
栅格布局
import sysfrom PyQt5.QtWidgets import (QWidget, QGridLayout, QPushButton, QApplication)# 我们创建了栅格化的按钮。class Example(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): # 创建一个QGridLayout实例,并把它放到程序窗口里。 grid = QGridLayout() self.setLayout(grid) names = ['Cls', 'Bck', '', 'Close', '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+'] # 创建按钮位置列表。 positions = [(i,j) for i in range(5) for j in range(4)] # 创建按钮,并使用addWidget()方法把按钮放到布局里面。 for position, name in zip(positions, names): if name == '': continue button = QPushButton(name) grid.addWidget(button, *position) self.move(300, 150) self.setWindowTitle('Calculator') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
制作提交反馈信息的布局
import sysfrom PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication)# 创建了一个有三个标签的窗口。两个行编辑和一个文版编辑,这是用QGridLayout模块搞定的。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): title = QLabel('Title') author = QLabel('Author') review = QLabel('Review') titleEdit = QLineEdit() authorEdit = QLineEdit() reviewEdit = QTextEdit() # 创建标签之间的空间。 grid = QGridLayout() grid.setSpacing(10) grid.addWidget(title, 1, 0) grid.addWidget(titleEdit, 1, 1) grid.addWidget(author, 2, 0) grid.addWidget(authorEdit, 2, 1) grid.addWidget(review, 3, 0) # 我们可以指定组件的跨行和跨列的大小。这里我们指定这个元素跨5行显示。 grid.addWidget(reviewEdit, 3, 1, 5, 1) self.setLayout(grid) self.setGeometry(300, 300, 350, 300) self.setWindowTitle('Review') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
Signals & Slots
import sysfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider, QVBoxLayout, QApplication)# 显示了QtGui.QLCDNumber和QtGui.QSlider模块,我们能拖动滑块让数字跟着发生改变。class Example(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): # 显示一个带有类似液晶显示屏效果的数字。 lcd = QLCDNumber(self) # 提供了一个垂直或水平滑动条 sld = QSlider(Qt.Horizontal, self) vbox = QVBoxLayout() vbox.addWidget(lcd) vbox.addWidget(sld) self.setLayout(vbox) # 这里是把滑块的变化和数字的变化绑定在一起。 sld.valueChanged.connect(lcd.display) # sender是信号的发送者,receiver是信号的接收者,slot是对这个信号应该做出的反应。 self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Signal and slot') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
重构事件处理器
import sysfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import QWidget, QApplication# 我们替换了事件处理器函数keyPressEvent()。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
事件对象
import sysfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QLabel# 我们在一个组件里显示鼠标的X和Y坐标。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): grid = QGridLayout() grid.setSpacing(10) x = 0 y = 0 # X Y坐标显示在QLabel组件里 self.text = "x: {0}, y: {1}".format(x, y) self.label = QLabel(self.text, self) grid.addWidget(self.label, 0, 0, Qt.AlignTop) # 事件追踪默认没有开启,当开启后才会追踪鼠标的点击事件。 self.setMouseTracking(True) self.setLayout(grid) self.setGeometry(300, 300, 350, 200) self.setWindowTitle('Event object') self.show() def mouseMoveEvent(self, e): # e代表了事件对象。 # 里面有我们触发事件(鼠标移动)的事件对象。 # x()和y()方法得到鼠标的x和y坐标点, # 然后拼成字符串输出到QLabel组件里。 x = e.x() y = e.y() text = "x: {0}, y: {1}".format(x, y) self.label.setText(text)if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
事件发生
import sysfrom PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication# buttonClicked()方法决定了是哪个按钮能调用sender()方法。class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): btn1 = QPushButton("Button 1", self) btn1.move(30, 50) btn2 = QPushButton("Button 2", self) btn2.move(150, 50) # 两个按钮都和同一个slot绑定。 btn1.clicked.connect(self.buttonClicked) btn2.clicked.connect(self.buttonClicked) self.statusBar() self.setGeometry(300, 300, 290, 150) self.setWindowTitle('Event sender') self.show() def buttonClicked(self): # 我们用调用sender()方法的方式决定了事件源。 # 状态栏显示了被点击的按钮。 sender = self.sender() self.statusBar().showMessage(sender.text() + ' was pressed')if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
信号发送
import sysfrom PyQt5.QtCore import pyqtSignal, QObjectfrom PyQt5.QtWidgets import QMainWindow, QApplication# 我们创建了一个叫closeApp的信号,# 这个信号会在鼠标按下的时候触发,事件与QMainWindow绑定。class Communicate(QObject): # Communicate类创建了一个pyqtSignal()属性的信号。 closeApp = pyqtSignal()class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # closeApp信号QMainWindow的close()方法绑定。 self.c = Communicate() self.c.closeApp.connect(self.close) self.setGeometry(300, 300, 290, 150) self.setWindowTitle('Emit signal') self.show() def mousePressEvent(self, event): # 点击窗口的时候,发送closeApp信号,程序终止。 self.c.closeApp.emit()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
点击退出
输入文字
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit, QInputDialog, QApplication)import sys# 这个示例有一个按钮和一个输入框,# 点击按钮显示对话框,输入的文本会显示在输入框里。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.btn = QPushButton('Dialog', self) self.btn.move(20, 20) self.btn.clicked.connect(self.showDialog) self.le = QLineEdit(self) self.le.move(130, 22) self.setGeometry(300, 300, 290, 150) self.setWindowTitle('Input dialog') self.show() def showDialog(self): # 这是显示一个输入框的代码。 # 第一个参数是输入框的标题, # 第二个参数是输入框的占位符。 # 对话框返回输入内容和一个布尔值, # 如果点击的是OK按钮,布尔值就返回True。 text, ok = QInputDialog.getText(self, 'Input Dialog', 'Enter your name:') if ok: self.le.setText(str(text))if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
选取颜色
from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame, QColorDialog, QApplication)from PyQt5.QtGui import QColorimport sys# 例子里有一个按钮和一个QFrame,默认的背景颜色为黑色,# 我们可以使用QColorDialog改变背景颜色。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 初始化QtGui.QFrame的背景颜色。 col = QColor(0, 0, 0) self.btn = QPushButton('Dialog', self) self.btn.move(20, 20) self.btn.clicked.connect(self.showDialog) self.frm = QFrame(self) self.frm.setStyleSheet("QWidget { background-color: %s }" % col.name()) self.frm.setGeometry(130, 22, 100, 100) self.setGeometry(300, 300, 250, 180) self.setWindowTitle('Color dialog') self.show() def showDialog(self): # 弹出一个QColorDialog对话框。 col = QColorDialog.getColor() if col.isValid(): self.frm.setStyleSheet("QWidget { background-color: %s }" % col.name())if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
选择字体
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QPushButton, QSizePolicy, QLabel, QFontDialog, QApplication)import sys# 我们创建了一个有一个按钮和一个标签的QFontDialog的对话框,# 我们可以使用这个功能修改字体样式。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): vbox = QVBoxLayout() btn = QPushButton('Dialog', self) btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) btn.move(20, 20) vbox.addWidget(btn) btn.clicked.connect(self.showDialog) self.lbl = QLabel('Knowledge only matters', self) self.lbl.move(130, 20) vbox.addWidget(self.lbl) self.setLayout(vbox) self.setGeometry(300, 300, 250, 180) self.setWindowTitle('Font dialog') self.show() def showDialog(self): # 弹出一个字体选择对话框。 # getFont()方法返回一个字体名称和状态信息。 # 状态信息有OK和其他两种。 font, ok = QFontDialog.getFont() # 如果点击OK,标签的字体就会随之更改。 if ok: self.lbl.setFont(font)if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
选择文件
from PyQt5.QtWidgets import (QMainWindow, QTextEdit, QAction, QFileDialog, QApplication)from PyQt5.QtGui import QIconimport sys# 本例中有一个菜单栏,一个置中的文本编辑框,一个状态栏# 点击菜单栏选项会弹出一个QtGui.QFileDialog对话框,# 在这个对话框里,你能选择文件,# 然后文件的内容就会显示在文本编辑框里。# 这里设置了一个文本编辑框,文本编辑框是基于QMainWindow组件的。class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.textEdit = QTextEdit() self.setCentralWidget(self.textEdit) self.statusBar() openFile = QAction(QIcon('open.png'), 'Open', self) openFile.setShortcut('Ctrl+O') openFile.setStatusTip('Open new File') openFile.triggered.connect(self.showDialog) menubar = self.menuBar() fileMenu = menubar.addMenu('&File') fileMenu.addAction(openFile) self.setGeometry(300, 300, 350, 300) self.setWindowTitle('File dialog') self.show() def showDialog(self): # 弹出QFileDialog窗口。 # getOpenFileName()方法的第一个参数是说明文字, # 第二个参数是默认打开的文件夹路径。 # 默认情况下显示所有类型的文件。 fname = QFileDialog.getOpenFileName(self, 'Open file', '/home') # 读取选中的文件,并显示在文本编辑框内 # (但是打开HTML文件时,是渲染后的结果,汗)。 if fname[0]: f = open(fname[0], 'r') with f: data = f.read() self.textEdit.setText(data)if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
QCheckBox文本标签复选框
from PyQt5.QtWidgets import QWidget, QCheckBox, QApplicationfrom PyQt5.QtCore import Qtimport sys# 这个例子中,有一个能切换窗口标题的单选框。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 这个是QCheckBox的构造器。 cb = QCheckBox('Show title', self) cb.move(20, 20) # 要设置窗口标题,我们就要检查单选框的状态。 # 默认情况下,窗口没有标题,单选框未选中。 cb.toggle() # 把changeTitle()方法和stateChanged信号关联起来。 # 这样,changeTitle()就能切换窗口标题了。 cb.stateChanged.connect(self.changeTitle) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('QCheckBox') self.show() def changeTitle(self, state): # 控件的状态是由changeTitle()方法控制的, # 如果空间被选中,我们就给窗口添加一个标题, # 如果没被选中,就清空标题。 if state == Qt.Checked: self.setWindowTitle('QCheckBox') else: self.setWindowTitle(' ')if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
切换按钮
from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame, QApplication)from PyQt5.QtGui import QColorimport sys"""我们创建了一个切换按钮和一个QWidget,并把QWidget的背景设置为黑色。点击不同的切换按钮,背景色会在红、绿、蓝之间切换(而且能看到颜色合成的效果,而不是单纯的颜色覆盖)。"""class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 设置颜色为黑色。 self.col = QColor(0, 0, 0) # 创建一个QPushButton,然后调用它的setCheckable()的方法就把这个按钮编程了切换按钮。 redb = QPushButton('Red', self) redb.setCheckable(True) redb.move(10, 10) # 把点击信号和我们定义好的函数关联起来, # 这里是把点击事件转换成布尔值。 redb.clicked[bool].connect(self.setColor) greenb = QPushButton('Green', self) greenb.setCheckable(True) greenb.move(10, 60) greenb.clicked[bool].connect(self.setColor) blueb = QPushButton('Blue', self) blueb.setCheckable(True) blueb.move(10, 110) blueb.clicked[bool].connect(self.setColor) self.square = QFrame(self) self.square.setGeometry(150, 20, 100, 100) self.square.setStyleSheet("QWidget { background-color: %s }" % self.col.name()) self.setGeometry(300, 300, 280, 170) self.setWindowTitle('Toggle button') self.show() def setColor(self, pressed): # 获取被点击的按钮。 source = self.sender() if pressed: val = 255 else: val = 0 # 如果是标签为“red”的按钮被点击,就把颜色更改为预设好的对应颜色。 if source.text() == "Red": self.col.setRed(val) elif source.text() == "Green": self.col.setGreen(val) else: self.col.setBlue(val) # 使用样式表(就是CSS的SS)改变背景色 self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name())if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
滑块
from PyQt5.QtWidgets import (QWidget, QSlider, QLabel, QApplication)from PyQt5.QtCore import Qtfrom PyQt5.QtGui import QPixmapimport sys# 这里是模拟的音量控制器。拖动滑块,能改变标签位置的图片。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 创建一个水平的QSlider。 sld = QSlider(Qt.Horizontal, self) sld.setFocusPolicy(Qt.NoFocus) sld.setGeometry(30, 40, 100, 30) # 创建一个QLabel组件并给它设置一个静音图标。 sld.valueChanged[int].connect(self.changeValue) self.label = QLabel(self) self.label.setPixmap(QPixmap('mute.png')) self.label.setGeometry(160, 40, 80, 30) self.setGeometry(300, 300, 280, 170) self.setWindowTitle('QSlider') self.show() def changeValue(self, value): # 把valueChanged信号跟changeValue()方法关联起来。 # 根据音量值的大小更换标签位置的图片。这段代码是:如果音量为0,就把图片换成 mute.png。 if value == 0: self.label.setPixmap(QPixmap('mute.png')) elif value > 0 and value <= 30: self.label.setPixmap(QPixmap('min.png')) elif value > 30 and value < 80: self.label.setPixmap(QPixmap('med.png')) else: self.label.setPixmap(QPixmap('max.png'))if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
进度条
from PyQt5.QtWidgets import (QWidget, QProgressBar, QPushButton, QApplication)from PyQt5.QtCore import QBasicTimerimport sys# 我们创建了一个水平的进度条和一个按钮,这个按钮控制进度条的开始和停止。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 新建一个QProgressBar构造器。 self.pbar = QProgressBar(self) self.pbar.setGeometry(30, 40, 200, 25) self.btn = QPushButton('Start', self) self.btn.move(40, 80) self.btn.clicked.connect(self.doAction) # 用时间控制进度条。 self.timer = QBasicTimer() self.step = 0 self.setGeometry(300, 300, 280, 170) self.setWindowTitle('QProgressBar') self.show() def timerEvent(self, e): # 每个QObject和又它继承而来的对象都有一个timerEvent()事件处理函数。 # 为了触发事件,我们重载了这个方法。 if self.step >= 100: self.timer.stop() self.btn.setText('Finished') return self.step = self.step + 1 self.pbar.setValue(self.step) def doAction(self): if self.timer.isActive(): self.timer.stop() self.btn.setText('Start') else: # 调用start()方法加载一个时间事件。这个方法有两个参数:过期时间和事件接收者。 self.timer.start(100, self) self.btn.setText('Stop')if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
图片
from PyQt5.QtWidgets import QWidget, QHBoxLayout,QLabel, QApplicationfrom PyQt5.QtGui import QPixmapimport sysclass Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): hbox = QHBoxLayout(self) # 创建一个QPixmap对象,接收一个文件作为参数。 pixmap = QPixmap("web.png") # 把QPixmap实例放到QLabel组件里。 lbl = QLabel(self) lbl.setPixmap(pixmap) hbox.addWidget(lbl) self.setLayout(hbox) self.move(300, 200) self.setWindowTitle('Red Rock') self.show()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
行编辑
import sysfrom PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QApplication)# 例子中展示了一个编辑组件和一个标签,我们在输入框里键入的文本,会立即在标签里显示出来。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 创建一个QLineEdit对象。 self.lbl = QLabel(self) qle = QLineEdit(self) qle.move(60, 100) self.lbl.move(60, 40) # 如果输入框的值有变化,就调用onChanged()方法。 qle.textChanged[str].connect(self.onChanged) self.setGeometry(300, 300, 280, 170) self.setWindowTitle('QLineEdit') self.show() def onChanged(self, text): # 在onChanged()方法内部,我们把文本框里的值赋值给了标签组件, # 然后调用adjustSize()方法让标签自适应文本内容。 self.lbl.setText(text) self.lbl.adjustSize()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
QSplitter组件分割线
# encoding: utf-8# module PyQt5.QtWidgets# from D:\PyCharm 2019.2.3\PycharmProject\QT5Project\venv\lib\site-packages\PyQt5\QtWidgets.pyd# by generator 1.147# no doc# importsimport PyQt5.QtCore as __PyQt5_QtCoreimport PyQt5.QtGui as __PyQt5_QtGuiimport sip as __sipfrom .QWidget import QWidgetclass QFrame(QWidget): """ QFrame(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()) """ def actionEvent(self, *args, **kwargs): # real signature unknown pass def changeEvent(self, QEvent): # real signature unknown; restored from __doc__ """ changeEvent(self, QEvent) """ pass def childEvent(self, *args, **kwargs): # real signature unknown pass def closeEvent(self, *args, **kwargs): # real signature unknown pass def connectNotify(self, *args, **kwargs): # real signature unknown pass def contextMenuEvent(self, *args, **kwargs): # real signature unknown pass def create(self, *args, **kwargs): # real signature unknown pass def customEvent(self, *args, **kwargs): # real signature unknown pass def destroy(self, *args, **kwargs): # real signature unknown pass def disconnectNotify(self, *args, **kwargs): # real signature unknown pass def dragEnterEvent(self, *args, **kwargs): # real signature unknown pass def dragLeaveEvent(self, *args, **kwargs): # real signature unknown pass def dragMoveEvent(self, *args, **kwargs): # real signature unknown pass def drawFrame(self, QPainter): # real signature unknown; restored from __doc__ """ drawFrame(self, QPainter) """ pass def dropEvent(self, *args, **kwargs): # real signature unknown pass def enterEvent(self, *args, **kwargs): # real signature unknown pass def event(self, QEvent): # real signature unknown; restored from __doc__ """ event(self, QEvent) -> bool """ return False def focusInEvent(self, *args, **kwargs): # real signature unknown pass def focusNextChild(self, *args, **kwargs): # real signature unknown pass def focusNextPrevChild(self, *args, **kwargs): # real signature unknown pass def focusOutEvent(self, *args, **kwargs): # real signature unknown pass def focusPreviousChild(self, *args, **kwargs): # real signature unknown pass def frameRect(self): # real signature unknown; restored from __doc__ """ frameRect(self) -> QRect """ pass def frameShadow(self): # real signature unknown; restored from __doc__ """ frameShadow(self) -> QFrame.Shadow """ pass def frameShape(self): # real signature unknown; restored from __doc__ """ frameShape(self) -> QFrame.Shape """ pass def frameStyle(self): # real signature unknown; restored from __doc__ """ frameStyle(self) -> int """ return 0 def frameWidth(self): # real signature unknown; restored from __doc__ """ frameWidth(self) -> int """ return 0 def hideEvent(self, *args, **kwargs): # real signature unknown pass def initPainter(self, *args, **kwargs): # real signature unknown pass def initStyleOption(self, QStyleOptionFrame): # real signature unknown; restored from __doc__ """ initStyleOption(self, QStyleOptionFrame) """ pass def inputMethodEvent(self, *args, **kwargs): # real signature unknown pass def isSignalConnected(self, *args, **kwargs): # real signature unknown pass def keyPressEvent(self, *args, **kwargs): # real signature unknown pass def keyReleaseEvent(self, *args, **kwargs): # real signature unknown pass def leaveEvent(self, *args, **kwargs): # real signature unknown pass def lineWidth(self): # real signature unknown; restored from __doc__ """ lineWidth(self) -> int """ return 0 def metric(self, *args, **kwargs): # real signature unknown pass def midLineWidth(self): # real signature unknown; restored from __doc__ """ midLineWidth(self) -> int """ return 0 def mouseDoubleClickEvent(self, *args, **kwargs): # real signature unknown pass def mouseMoveEvent(self, *args, **kwargs): # real signature unknown pass def mousePressEvent(self, *args, **kwargs): # real signature unknown pass def mouseReleaseEvent(self, *args, **kwargs): # real signature unknown pass def moveEvent(self, *args, **kwargs): # real signature unknown pass def nativeEvent(self, *args, **kwargs): # real signature unknown pass def paintEvent(self, QPaintEvent): # real signature unknown; restored from __doc__ """ paintEvent(self, QPaintEvent) """ pass def receivers(self, *args, **kwargs): # real signature unknown pass def resizeEvent(self, *args, **kwargs): # real signature unknown pass def sender(self, *args, **kwargs): # real signature unknown pass def senderSignalIndex(self, *args, **kwargs): # real signature unknown pass def setFrameRect(self, QRect): # real signature unknown; restored from __doc__ """ setFrameRect(self, QRect) """ pass def setFrameShadow(self, QFrame_Shadow): # real signature unknown; restored from __doc__ """ setFrameShadow(self, QFrame.Shadow) """ pass def setFrameShape(self, QFrame_Shape): # real signature unknown; restored from __doc__ """ setFrameShape(self, QFrame.Shape) """ pass def setFrameStyle(self, p_int): # real signature unknown; restored from __doc__ """ setFrameStyle(self, int) """ pass def setLineWidth(self, p_int): # real signature unknown; restored from __doc__ """ setLineWidth(self, int) """ pass def setMidLineWidth(self, p_int): # real signature unknown; restored from __doc__ """ setMidLineWidth(self, int) """ pass def sharedPainter(self, *args, **kwargs): # real signature unknown pass def showEvent(self, *args, **kwargs): # real signature unknown pass def sizeHint(self): # real signature unknown; restored from __doc__ """ sizeHint(self) -> QSize """ pass def tabletEvent(self, *args, **kwargs): # real signature unknown pass def timerEvent(self, *args, **kwargs): # real signature unknown pass def updateMicroFocus(self, *args, **kwargs): # real signature unknown pass def wheelEvent(self, *args, **kwargs): # real signature unknown pass def __init__(self, parent=None, flags, Qt_WindowFlags=None, Qt_WindowType=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ pass Box = 1 HLine = 4 NoFrame = 0 Panel = 2 Plain = 16 Raised = 32 Shadow_Mask = 240 Shape_Mask = 15 StyledPanel = 6 Sunken = 48 VLine = 5 WinPanel = 3
下拉选框
from PyQt5.QtWidgets import (QWidget, QLabel, QComboBox, QApplication)import sys# 本例包含了一个QComboBox和一个QLabel。# 下拉选择框有五个选项,都是Linux的发行版名称,标签内容为选定的发行版名称。class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.lbl = QLabel("Ubuntu", self) # 创建一个QComboBox组件和五个选项。 combo = QComboBox(self) combo.addItem("Ubuntu") combo.addItem("Mandriva") combo.addItem("Fedora") combo.addItem("Arch") combo.addItem("Gentoo") combo.move(50, 50) self.lbl.move(50, 150) # 在选中的条目上调用onActivated()方法。 combo.activated[str].connect(self.onActivated) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('QComboBox') self.show() def onActivated(self, text): # 在方法内部,设置标签内容为选定的字符串,然后设置自适应文本大小。 self.lbl.setText(text) self.lbl.adjustSize()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
自定义组件
from PyQt5.QtWidgets import (QWidget, QSlider, QApplication, QHBoxLayout, QVBoxLayout)from PyQt5.QtCore import QObject, Qt, pyqtSignalfrom PyQt5.QtGui import QPainter, QFont, QColor, QPenimport sys# 本例中,我们使用了QSlider和一个自定义组件,由进度条控制。# 显示的有物体(也就是CD/DVD)的总容量和剩余容量。进度条的范围是1~750。# 如果值达到了700(OVER_CAPACITY),就显示为红色,代表了烧毁了的意思。# 烧录组件在窗口的底部,这个组件是用QHBoxLayout和QVBoxLayout组成的。class Communicate(QObject): updateBW = pyqtSignal(int)# 基于QWidget组件。class BurningWidget(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 修改组件进度条的高度,默认的有点小。 self.setMinimumSize(1, 30) self.value = 75 self.num = [75, 150, 225, 300, 375, 450, 525, 600, 675] def setValue(self, value): self.value = value def paintEvent(self, e): qp = QPainter() qp.begin(self) self.drawWidget(qp) qp.end() def drawWidget(self, qp): MAX_CAPACITY = 700 OVER_CAPACITY = 750 # 使用比默认更小一点的字体,这样更配。 font = QFont('Serif', 7, QFont.Light) qp.setFont(font) """ 动态的渲染组件,随着窗口的大小而变化,这就是我们计算窗口大小的原因。 最后一个参数决定了组件的最大范围,进度条的值是由窗口大小按比例计算出来的。 最大值的地方填充的是红色。注意这里使用的是浮点数,能提高计算和渲染的精度。 绘画由三部分组成,黄色或红色区域和黄色矩形,然后是分割线,最后是添上代表容量的数字。 """ size = self.size() w = size.width() h = size.height() step = int(round(w / 10)) till = int(((w / OVER_CAPACITY) * self.value)) full = int(((w / OVER_CAPACITY) * MAX_CAPACITY)) if self.value >= MAX_CAPACITY: qp.setPen(QColor(255, 255, 255)) qp.setBrush(QColor(255, 255, 184)) qp.drawRect(0, 0, full, h) qp.setPen(QColor(255, 175, 175)) qp.setBrush(QColor(255, 175, 175)) qp.drawRect(full, 0, till-full, h) else: qp.setPen(QColor(255, 255, 255)) qp.setBrush(QColor(255, 255, 184)) qp.drawRect(0, 0, till, h) pen = QPen(QColor(20, 20, 20), 1, Qt.SolidLine) qp.setPen(pen) qp.setBrush(Qt.NoBrush) qp.drawRect(0, 0, w-1, h-1) j = 0 for i in range(step, 10*step, step): qp.drawLine(i, 0, i, 5) # 这里使用字体去渲染文本。 # 必须要知道文本的宽度,这样才能让文本的中间点正好落在竖线上。 metrics = qp.fontMetrics() fw = metrics.width(str(self.num[j])) qp.drawText(i-fw/2, h/2, str(self.num[j])) j = j + 1class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): OVER_CAPACITY = 750 sld = QSlider(Qt.Horizontal, self) sld.setFocusPolicy(Qt.NoFocus) sld.setRange(1, OVER_CAPACITY) sld.setValue(75) sld.setGeometry(30, 40, 150, 30) self.c = Communicate() self.wid = BurningWidget() self.c.updateBW[int].connect(self.wid.setValue) sld.valueChanged[int].connect(self.changeValue) hbox = QHBoxLayout() hbox.addWidget(self.wid) vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300, 300, 390, 210) self.setWindowTitle('Burning widget') self.show() def changeValue(self, value): # 拖动滑块的时候,调用了changeValue()方法。 # 这个方法内部,我们自定义了一个可以传参的updateBW信号。 # 参数就是滑块的当前位置。 # 这个数值之后还用来于Burning组件,然后重新渲染Burning组件。 self.c.updateBW.emit(value) self.wid.repaint()if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
转载地址:https://kaisarh.blog.csdn.net/article/details/102933826 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月24日 17时47分44秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Servlet_生命周期详解
2019-05-01
Servlet_3.0注解配置
2019-05-01
IDEA与tomcat相关配置
2019-05-01
Servlet_体系结构
2019-05-01
Servlet_urlpartten配置
2019-05-01
Request_原理
2019-05-01
Request_继承体系
2019-05-01
Request_获取请求行数据_方法介绍
2019-05-01
spring的优势
2019-05-01
编写jdbc的工程代码用于分析程序的耦合
2019-05-01
工厂模式解耦的升级版
2019-05-01
hrm中的jwt认证:获取用户数据
2019-05-01
前端权限控制:获取用户信息接口构造数据
2019-05-01
前端权限控制:前端菜单控制
2019-05-01
前端权限控制:实现思路分析-待修改
2019-05-01
有状态服务和无状态服务
2019-05-01
基于jwt的用户鉴权:配置拦截器并测试
2019-05-01
POI的概述
2019-05-01
POI文件导入:跨服务器调用查询部门信息
2019-05-01
DataURL:概述
2019-05-01