1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【PyQt5 知识点示例代码】布局 菜单 信号与槽 对话框 组件

【PyQt5 知识点示例代码】布局 菜单 信号与槽 对话框 组件

时间:2022-07-16 14:39:26

相关推荐

【PyQt5 知识点示例代码】布局 菜单 信号与槽 对话框 组件

PyQt5笔记

重写按钮的关闭事件 closeEvent布局绝对布局盒布局网络布局状态栏、菜单栏、子菜单、勾选菜单、右键菜单信号与槽点击按钮显示窗口重写keyPressEvent - Esc关闭窗口内置槽函数 - 滚动条控制LCD自定义信号事件对象、重写mouseMoveEvent对话框输入对话框文件对话框颜色对话框字体对话框PyQt5组件按钮 QPushButton复选框 QCheckBox列表框 QListWidget行编辑 QLineEdit下拉式列表框 QComBox日历控件 QCalendarWdget进度条 QProgressBar树状列表 QTreeWidget表格 QTableWidget分割器 QSplitter

代码选自张少娴老师《Python量化交易从入门到实战》

重写按钮的关闭事件 closeEvent

核心就是重写父类QWidgetcloseEvent方法

import sysfrom PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QMessageBoxclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 在窗口上创建一个按钮对象qbtn = QPushButton('关闭', self)# 将按钮对象的click事件连接到窗口的关闭方法qbtn.clicked.connect(self.close)# 指定按钮的位置qbtn.move(50, 50)# 设定窗口的位置和大小self.setGeometry(300, 300, 320, 160)self.setWindowTitle('请单击关闭按钮')self.show()def closeEvent(self, event):reply = QMessageBox.question(self, '提示信息','确认要关闭窗口?',QMessageBox.Yes | QMessageBox.No,QMessageBox.No)if reply == QMessageBox.Yes:event.accept()else:event.ignore()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

布局

绝对布局

强行用move控制位置,不推荐这么做,页面兼容性很差

import sysfrom PyQt5.QtWidgets import QWidget, QPushButton, QApplicationclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):qbtn1 = QPushButton('功能1', self)qbtn1.move(50, 50)qbtn2 = QPushButton('功能2', self)qbtn2.move(100, 100)qbtn3 = QPushButton('功能3', self)qbtn3.move(150, 150)self.setGeometry(300, 300, 280, 170)self.setWindowTitle('绝对定位')self.show()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

盒布局

addStretch表示“塞入弹簧”,用来控制盒布局的周围距离(塞的特多距离特大)

import sysfrom PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QApplicationclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建两个按钮对象okButton = QPushButton("确认")cancelButton = QPushButton("取消")hbox = QHBoxLayout() # 创建一个水平盒布局对象hboxhbox.addStretch(4)hbox.addWidget(okButton)hbox.addWidget(cancelButton)hbox.addStretch(1)vbox = QVBoxLayout() # 创建一个垂直盒布局对象vboxvbox.addStretch(1)vbox.addLayout(hbox) # 弹簧把hbox压到了最下面self.setLayout(vbox) # 将vbox设置为窗口的主布局对象self.setGeometry(300, 300, 360, 150)self.setWindowTitle('盒布局')self.show()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

网络布局

import sysfrom PyQt5.QtWidgets import QWidget, QGridLayout, QPushButton, QApplicationclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):grid = QGridLayout() # 创建一个网格布局grid,并将其设为窗口的主布局self.setLayout(grid)names = ['Cls', 'Bck', '', 'Close', # 创建20个元素的字符串列表'7', '8', '9', '/','4', '5', '6', '*','1', '2', '3', '-','0', '.', '=', '+']positions = [(i, j) for i in range(5) for j in range(4)] # 创建20个元素的元组列表for position, name in zip(positions, names): # 循环取每个坐标和按钮名称if name == '': # 空字符串则什么都不做continuebutton = QPushButton(name)print(*position)grid.addWidget(button, *position)self.move(300, 160)self.setWindowTitle('计算器')self.show()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

状态栏、菜单栏、子菜单、勾选菜单、右键菜单

import sysfrom PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QMenufrom PyQt5.QtGui import QIconclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):# 行为相关的代码# 创建一个行为对象exitAction = QAction(QIcon('exit.png'), '退出(&Q)', self)# 设置行为的快捷键exitAction.setShortcut('Ctrl+Q')# 设置行为的状态栏提示文本exitAction.setStatusTip('退出应用程序。')# 将该行为作关联到窗口的关闭事件exitAction.triggered.connect(self.close)# 菜单栏相关的代码# 创建一个菜单栏menubar = self.menuBar()# 在菜单栏中添加一个菜单fileMenu = menubar.addMenu('文件(&F)')# 创建两个行为和一个菜单,并将两个行为添加到菜单impTextAct = QAction('文本文件', self)impPictAct = QAction('图形文件', self)impMenu = QMenu('导入', self)impMenu.addAction(impTextAct)impMenu.addAction(impPictAct)fileMenu.addMenu(impMenu) # 将子菜单添加到父菜单fileMenu.addSeparator()# 在菜单中加入一条分隔线fileMenu.addAction(exitAction)# 将行为添加到菜单fileMenu.addAction(exitAction)# ①创建一个带勾选功能的行为viewStatAct = QAction('显示状态栏', self, checkable=True)viewStatAct.setStatusTip('状态栏显示开关。')viewStatAct.setChecked(True)viewStatAct.triggered.connect(self.toggleMenu)# ②创建一个新的菜单,并添加到菜单栏当中viewMenu = menubar.addMenu('视图(&V)')viewMenu.addAction(viewStatAct)self.statusBar().showMessage('就绪')self.setGeometry(300, 300, 360, 160)self.setWindowTitle('主窗口')self.show()def toggleMenu(self, state):"""③行为“显示状态栏”的处理函数"""statusbar = self.statusBar()if state:statusbar.show()else:statusbar.hide()def contextMenuEvent(self, event):cmenu = QMenu(self)func1Act = cmenu.addAction("功能1")func2Act = cmenu.addAction("功能2")quitAct = cmenu.addAction("退出")action = cmenu.exec_(self.mapToGlobal(event.pos()))if action == quitAct:self.close()if __name__ == '__main__':app = QApplication(sys.argv)w = MainWindow()sys.exit(app.exec_())

信号与槽

对象1.信号.connect(对象2.槽函数)

点击按钮显示窗口

import sysfrom PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication, QMessageBoxclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):btn1 = QPushButton("按钮1", self)btn1.move(30, 50)btn1.clicked.connect(self.showMsg)btn2 = QPushButton("按钮2", self)btn2.move(150, 50)btn2.clicked.connect(self.showMsg) # btn2与btn1连接到相同的槽函数self.setGeometry(300, 300, 290, 150)self.setWindowTitle('信号与槽')self.show()def showMsg(self):sender = self.sender() # 获取信号是由哪个控件发出的,可以获取到btn1或btn2QMessageBox.information(self, '提示信息', f'{sender.text()}被按下。')if __name__ == '__main__':app = QApplication(sys.argv)ex = MainWindow()sys.exit(app.exec_())

重写keyPressEvent - Esc关闭窗口

import sysfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import QWidget, QApplicationclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 360, 130) # (pos_x, pos_y, width, height)self.setWindowTitle('按Esc键关闭窗口')self.show()# 重写了键盘事件处理器def keyPressEvent(self, e):if e.key() == Qt.Key_Escape:self.close()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

内置槽函数 - 滚动条控制LCD

import sysfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import QWidget, QLCDNumber, QSlider, QVBoxLayout, QApplicationclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建一个QLCDNumber控件,QLCDNumber用于显示一个带有仿真显示屏效果的数字lcd = QLCDNumber(self)# 创建一个QSlider控件,QSlider提供了一个水平或垂直滑动条sld = QSlider(Qt.Horizontal, self)vbox = QVBoxLayout()vbox.addWidget(lcd)vbox.addWidget(sld)self.setLayout(vbox)# 将滑动条的valueChanged信号与LCD的display槽函数连接sld.valueChanged.connect(lcd.display)self.setGeometry(300, 300, 300, 150)self.setWindowTitle('LCD显示')self.show()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

自定义信号

自定义信号方法一:自定义信号类继承QObject

import sysfrom PyQt5.QtCore import pyqtSignal, QObjectfrom PyQt5.QtWidgets import QMainWindow, QApplicationclass MySignal(QObject): # 自定义信号需要继承QObjectsigClose = pyqtSignal()class MainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.sig = MySignal():self.sig.sigClose.connect(self.close) # 将sig的sigClose信号与窗口的close()槽函数连接self.setGeometry(300, 300, 320, 150)self.setWindowTitle('单击鼠标关闭')self.show()# 重写mousePressEvent事件处理器,该处理器在鼠标按下时触发def mousePressEvent(self, event):self.sig.sigClose.emit() # 将sig的sigClose信号发出,会调用与之连接的close()槽函数# self.close()if __name__ == '__main__':app = QApplication(sys.argv)w = MainWindow ()sys.exit(app.exec_())

自定义信号方法二:直接在MainWindow类中定义信号属性,不需要专门定义一个类

import sysfrom PyQt5.QtCore import pyqtSignalfrom PyQt5.QtWidgets import QMainWindow, QApplicationclass MainWindow(QMainWindow):# 直接在MainWindow类中定义信号属性,不需要专门定义一个类sigClose = pyqtSignal()def __init__(self):super().__init__()self.initUI()def initUI(self):# 将sigClose信号与窗口的close()槽函数连接self.sigClose.connect(self.close)self.setGeometry(300, 300, 320, 150)self.setWindowTitle('单击鼠标关闭')self.show()def mousePressEvent(self, event):self.sigClose.emit()if __name__ == '__main__':app = QApplication(sys.argv)w = MainWindow ()sys.exit(app.exec_())

事件对象、重写mouseMoveEvent

import sysfrom PyQt5.QtWidgets import QWidget, QApplication, QLabelclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# QLabel控件用于显示文本self.label = QLabel("x: 0, y: 0 ", self)self.label.move(10, 10)# 鼠标指针移动可能会触发鼠标移动事件,该事件如果开启会被频繁触发,默认是不开启的self.setMouseTracking(True)self.setGeometry(300, 300, 350, 200)self.setWindowTitle('事件对象')self.show()def mouseMoveEvent(self, e):x = e.x()y = e.y()text = f"x: {x}, y: {y}"self.label.setText(text)if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

对话框

输入对话框

import sysfrom PyQt5.QtWidgets import QWidget, QPushButton, QLineEdit, QInputDialog, QApplicationclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.btn = QPushButton('输入', self)self.btn.move(20, 20)self.btn.clicked.connect(self.showDialog)# qLineEdit行编辑对象,用于单行输入self.le = QLineEdit(self)self.le.setEnabled(False) # 设置为不可输入self.le.move(20, 60)self.setGeometry(300, 300, 300, 110)self.setWindowTitle('输入对话框')self.show()def showDialog(self):text, ok = QInputDialog.getText(self, '请输入', '您的名字:')if ok:self.le.setText(str(text))if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

文件对话框

import sysfrom PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,QFileDialog, QApplication)class Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.btn = QPushButton('打开文件', self)self.btn.move(20, 20)self.btn.clicked.connect(self.showDialog)self.le1 = QLineEdit(self)self.le1.setEnabled(False)self.le1.resize(360,22) # 调整大小self.le1.move(20, 60)self.le2 = QLineEdit(self)self.le2.setEnabled(False)self.le2.resize(360,22)self.le2.move(20, 90)self.setGeometry(300, 300, 400, 140)self.setWindowTitle('文件对话框')self.show()def showDialog(self): # ②fileName, filetype = QFileDialog.getOpenFileName(self,"打开文件","./","所有文件(*);;Python程序(*.py);;文本文件(*.txt)")if fileName:self.le1.setText(str(fileName))self.le2.setText(str(filetype))if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

颜色对话框

import sysfrom PyQt5.QtWidgets import (QWidget, QPushButton, QFrame,QColorDialog, QApplication)from PyQt5.QtGui import QColorclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):col = QColor(0, 0, 0)self.btn = QPushButton('选择颜色', self)self.btn.move(20, 20)self.btn.clicked.connect(self.showDialog)# QFrame对象frm, QFrame继承自QWidget,在窗口中表现为一块区域self.frm = QFrame(self)# QFrame默认不可见,需要通过样式表(StyleSheet)来设置样式self.frm.setStyleSheet(f"QWidget {{ background-color: {col.name()} }}")self.frm.setGeometry(130, 22, 100, 100)self.setGeometry(300, 300, 300, 150)self.setWindowTitle('颜色对话框')self.show()def showDialog(self):col = QColorDialog.getColor(title='请选择颜色')if col.isValid(): # 判断是否有效,如果点击Cancel则无效self.frm.setStyleSheet(f"QWidget {{ background-color: {col.name()} }}")if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

字体对话框

import sysfrom PyQt5.QtWidgets import (QWidget, QVBoxLayout, QPushButton,QLabel, QFontDialog, QApplication)from PyQt5.QtGui import QFontclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):vbox = QVBoxLayout()self.setLayout(vbox)btn = QPushButton('选择字体', self)btn.clicked.connect(self.showDialog)vbox.addWidget(btn)self.font = QFont("宋体", 12)self.lbl = QLabel('桃李春风一杯酒,江湖夜雨十年灯。', self)self.lbl.setFont(self.font)vbox.addWidget(self.lbl)self.setGeometry(300, 300, 300, 180)self.setWindowTitle('字体对话框')self.show()def showDialog(self):self.font, ok = QFontDialog.getFont(self.font, caption='请选择字体')if ok:self.lbl.setFont(self.font)if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

PyQt5组件

按钮 QPushButton

import sysfrom PyQt5.QtWidgets import QWidget, QPushButton, QApplicationclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.btn = QPushButton('未按下', self)self.btn.setCheckable(True)# 使按钮具有复选功能self.btn.move(50, 30)# 对于复现按钮,此处的按钮单击信号多了一个布尔型的参数,表示按下的状态self.btn.clicked[bool].connect(self.setText)self.setGeometry(300, 300, 280, 120)self.setWindowTitle('复选按钮')self.show()def setText(self, pressed):if pressed:self.btn.setText("已按下")else:self.btn.setText("未按下")if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

复选框 QCheckBox

import sysfrom PyQt5.QtWidgets import QWidget, QCheckBox, QLabel, QApplicationfrom PyQt5.QtCore import Qtclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):cb = QCheckBox('显示文字', self)cb.move(20, 20)cb.setTristate(True) # 开启三态选择cb.setCheckState(Qt.Checked)cb.stateChanged.connect(self.changeText)self.lbl = QLabel('桃李春风一杯酒,江湖夜雨十年灯。', self)self.lbl.move(20, 60)self.setGeometry(300, 300, 290, 120)self.setWindowTitle('复选框')self.show()def changeText(self, state):if state == Qt.Checked: # Qt.Checked 2 选中self.lbl.setText('桃李春风一杯酒,江湖夜雨十年灯。')elif state == Qt.PartiallyChecked: # Qt.PartiallyChecked 1 半选中self.lbl.setText('桃李春风一杯酒,')else: # Qt.Unchecked 0 未选中self.lbl.setText('')if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

列表框 QListWidget

import sysfrom PyQt5.QtWidgets import (QWidget, QLabel,QListWidget, QApplication)class Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.lbl = QLabel(self)self.lbl.move(20, 20)lw = QListWidget(self)lw.addItem("Python")lw.addItem("C++")lw.addItem("C#")lw.addItem("Java")lw.resize(230, 100)lw.move(20, 50)# 将lw的currentTextChanged信号与槽函数self.TextChanged连接# currentTextChanged信号在列表框中选项文本改变时发出,并将改变后的文本作为参数传递给槽函数lw.currentTextChanged[str].connect(self.TextChanged)self.setGeometry(300, 300, 320, 170)self.setWindowTitle('列表框')self.show()def TextChanged(self, text):self.lbl.setText(text)self.lbl.adjustSize()print(text)if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

行编辑 QLineEdit

import sysfrom PyQt5.QtWidgets import (QWidget, QLabel,QLineEdit, QApplication)class Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.lbl = QLabel(self)self.lbl.move(20, 20)le = QLineEdit(self) # ①le.move(20, 50)le.textChanged[str].connect(self.TextChanged) # ②self.setGeometry(300, 300, 280, 170)self.setWindowTitle('行编辑')self.show()def TextChanged(self, text): # ③self.lbl.setText(text)self.lbl.adjustSize()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

下拉式列表框 QComBox

import sysfrom PyQt5.QtWidgets import (QWidget, QLabel,QComboBox, QApplication)class Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.lbl = QLabel(self)self.lbl.move(20, 20)combo = QComboBox(self)combo.addItems(["Python", "C++", "C#", "Java"])combo.setGeometry(20,50,200,30)# combo = QComboBox(self)# combo.addItem("Python")# combo.addItem("C++")# combo.addItem("C#")# combo.addItem("Java")combo.move(20, 50)combo.currentTextChanged[str].connect(self.TextChanged)combo.currentTextChanged.emit(combo.currentText())combo.setEditable(True)combo.editTextChanged[str].connect(self.TextChanged)self.setGeometry(300, 300, 320, 160)self.setWindowTitle('下拉式列表框')self.show()def TextChanged(self, text):self.lbl.setText(text)self.lbl.adjustSize()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

日历控件 QCalendarWdget

import sysfrom PyQt5.QtWidgets import (QWidget, QCalendarWidget,QVBoxLayout, QLabel, QApplication)from PyQt5.QtCore import QDate, Qtclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):cal = QCalendarWidget(self) # 创建一个日期对象cal.setGridVisible(True) # 在日历上显示格线cal.clicked[QDate].connect(self.showDate) # 将日历的clicked信号与槽函数self.showDate连接self.lbl = QLabel(self) # 创建一个QLabel对象self.lbl.setAlignment(Qt.AlignHCenter) # 居中显示# 主动发出日历的clicked信号,并将日历的当前参数日期作为参数传递cal.clicked.emit(cal.selectedDate())vbox = QVBoxLayout()vbox.addWidget(cal)vbox.addWidget(self.lbl)self.setLayout(vbox)self.setGeometry(300, 300, 350, 300)self.setWindowTitle('日历')self.show()def showDate(self, date):self.lbl.setText(date.toString())self.lbl.adjustSize()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

进度条 QProgressBar

import sysfrom PyQt5.QtWidgets import (QWidget, QProgressBar,QPushButton, QApplication)from PyQt5.QtCore import QBasicTimerclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.pbar = QProgressBar(self) # 创建一个进度条对象(默认为水平进度条)self.pbar.setGeometry(20, 20, 260, 25) # 设置进度条的位置和大小self.btn = QPushButton('开始', self)self.btn.move(20, 60)self.btn.clicked.connect(self.onBtnClicked)self.timer = QBasicTimer() # 创建一个QBasicTimer对象self.step = 0 # 初始化为0self.setGeometry(300, 300, 300, 110)self.setWindowTitle('进度条')self.show()def onBtnClicked(self): # 按钮单击信号的槽函数if not self.timer.isActive(): # 判断定时器是否正在运行,不在运行则开始运行self.timer.start(100, self) # 启动定时器,时钟间隔为100msself.btn.setText('暂停')else: # 定时器在运行则暂停self.timer.stop()self.btn.setText('开始')def timerEvent(self, e): # 重写timer事件处理器if self.step >= 100: # 进度计数达到100self.timer.stop()self.btn.setText('结束')returnself.step = self.step + 1self.pbar.setValue(self.step)if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

树状列表 QTreeWidget

import sysfrom PyQt5.QtWidgets import *class Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建3个按钮addBtn = QPushButton("添加节点")updBtn = QPushButton("修改节点")delBtn = QPushButton("删除节点")addBtn.clicked.connect(self.addTreeNodeBtn)updBtn.clicked.connect(self.updTreeNodeBtn)delBtn.clicked.connect(self.delTreeNodeBtn)operatorLayout = QHBoxLayout()operatorLayout.addWidget(addBtn)operatorLayout.addWidget(updBtn)operatorLayout.addWidget(delBtn)self.tree = QTreeWidget(self) # 创建一个QTreeWidget对象treeself.tree.setColumnCount(2) # 将该对象设置为两列self.tree.setHeaderLabels(['名称', '值']) # 设置每列的标题self.tree.setColumnWidth(0, 220) # 设置第一列的宽度self.tree.clicked.connect(self.onTreeClicked)root = QTreeWidgetItem(self.tree) # 创建一个节点rootroot.setText(0, '量化交易平台') # 设置根节点第1列的值root.setText(1, '0') # 设置根节点第2列的值child1 = QTreeWidgetItem(root) # 创建一个节点child1,作为root的子节点child1.setText(0, '服务器+客户端')child1.setText(1, '1')child2 = QTreeWidgetItem(root) # 创建一个节点child2,作为root的子节点child2.setText(0, '单服务器')child2.setText(1, '2')child3 = QTreeWidgetItem(root) # 创建一个节点child3,作为root的子节点child3.setText(0, '单客户端')child3.setText(1, '3')child4 = QTreeWidgetItem(child3) # 创建一个节点child4,作为child3的子节点child4.setText(0, 'vn.py')child4.setText(1, '31')child5 = QTreeWidgetItem(child3) # 创建一个节点child5,作为child3的子节点child5.setText(0, 'QuickLib')child5.setText(1, '32')self.lbl = QLabel("量化交易平台分类。", self)mainLayout = QVBoxLayout(self)mainLayout.addLayout(operatorLayout)mainLayout.addWidget(self.tree)mainLayout.addWidget(self.lbl)self.setLayout(mainLayout)self.setGeometry(300, 300, 380, 260)self.setWindowTitle('树型列表')self.show()def onTreeClicked(self, index):item = self.tree.currentItem()self.lbl.setText(f"名称={item.text(0)} ,值={item.text(1)}")def addTreeNodeBtn(self): # 添加节点self.lbl.setText('添加了一个节点。')item = self.tree.currentItem() # 获取当前节点node = QTreeWidgetItem(item) # 创建当前节点的子节点node.setText(0, '添加')node.setText(1, '101')def updTreeNodeBtn(self): # 修改节点self.lbl.setText('修改了一个节点。')item = self.tree.currentItem() # 获取当前节点item.setText(0, '修改')item.setText(1, '102')def delTreeNodeBtn(self): # 删除节点item = self.tree.currentItem() # 获取当前节点if item.parent(): # 有父节点,则不是根节点self.lbl.setText('删除了一个节点。')item.parent().removeChild(item) # 从父节删除子节点else: # 无父节点,则是根节点self.lbl.setText('根节点不允许删除。')if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

表格 QTableWidget

import sysimport pandas as pdfrom PyQt5.QtWidgets import (QWidget, QTableWidget, QTableWidgetItem,QAbstractItemView, QVBoxLayout, QApplication)class Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.headers = ['代码','名称','开盘价','最高价','最低价','收盘价'] # 表头标题列表self.stockList = QTableWidget() # 创建一个表格控件self.stockList.setColumnCount(6) # 表格设置为6列self.stockList.setHorizontalHeaderLabels(self.headers) # 设置表格表头self.stockList.setEditTriggers(QAbstractItemView.NoEditTriggers) # 将表格设置为不允许编辑self.stockList.setSelectionBehavior(QAbstractItemView.SelectRows) # 表格选择模式设置为"行选择"self.stockList.setSelectionMode(QAbstractItemView.SingleSelection) # 设置为只能选择单行,不多同时选择多行self.stockList.horizontalHeader().setStyleSheet('QHeaderView::section{background:lightgray}') # 设置表头样式# 从CSV文件中读取数据,保存到一个DataFrame对象中stock_list = pd.read_csv(r'stock_list.csv', header=None, encoding='gbk')for stock in stock_list.itertuples():self.add_line(stock)vbox = QVBoxLayout()vbox.addWidget(self.stockList)self.setLayout(vbox)self.setGeometry(300, 300, 800, 300)self.setWindowTitle('表格')self.show()def add_line(self, stock):rowCount = self.stockList.rowCount() # 取表格当前行数self.stockList.setRowCount(rowCount + 1) # 表格增加一行for i in range(6): # 循环处理stock的6个数据item = QTableWidgetItem(str(stock[i + 1])) # 从stock中取一个数据self.stockList.setItem(rowCount, i, item) # 指定单元格和行和列,以及数据if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

分割器 QSplitter

import sysfrom PyQt5.QtWidgets import (QWidget, QHBoxLayout, QGroupBox,QSplitter, QApplication)from PyQt5.QtCore import Qtclass Widget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):hbox = QHBoxLayout(self)topleft = QGroupBox('顶部左',self)topleft.setMinimumHeight(80)topright = QGroupBox('顶部右',self)bottom = QGroupBox('底部',self)splitter1 = QSplitter(Qt.Horizontal)splitter1.addWidget(topleft)splitter1.addWidget(topright)splitter2 = QSplitter(Qt.Vertical)splitter2.addWidget(splitter1)splitter2.addWidget(bottom)hbox.addWidget(splitter2)self.setLayout(hbox)self.setGeometry(300, 300, 300, 200)self.setWindowTitle('分割器')self.show()if __name__ == '__main__':app = QApplication(sys.argv)w = Widget()sys.exit(app.exec_())

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。