import sys
import math
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt # 有一些常量在这里面,eg:blue
from PyQt5.QtCore import * # 日历控件
# 下面两行:改任务栏图标,Windows系统需要
# import ctypes
# ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("myappid")
class FirstMainWin(QTabWidget): # 直接一整个屏幕就是一个选项卡窗口
def __init__(self, parent=None):
super(FirstMainWin, self).__init__(parent)
"""1、标题尺寸窗口图标"""
self.setWindowTitle('first mainWindow app')
# x,y,w,h & self.resize(1800,1200)
self.setGeometry(100, 300, 1800, 1200)
self.setWindowIcon(QIcon('icon/window_icon.jpeg'))
'''2、创建用于显示控件的窗口'''
self.tab1 = QWidget()
self.tab2 = QWidget()
self.tab3 = QWidget()
# 将窗口和选项卡绑定
self.addTab(self.tab1, 'tab1')
self.addTab(self.tab2, 'tab2')
self.addTab(self.tab3, 'tab3')
self.tab1UI()
self.tab2UI()
self.tab3UI()
'''----------------------------------'''
# central_Qwidget = self.centralWidget()
# self.initUI()
'''===============================函数的分割线1==============================='''
def tab1UI(self):
# 表单布局
''''''
'''创建对象'''
operatorLayout = QVBoxLayout()
browserLayout = QVBoxLayout()
addBtn = QPushButton('添加节点')
updateBtn = QPushButton('修改节点')
deleteBtn = QPushButton('删除节点')
self.tree = QTreeWidget() # 树
label1 = QLabel(self)
label2 = QLabel(self)
'''=====================控件设置====================='''
'''label设置'''
label1.setText('<font color = red><b>本篇内容来源于b站up主萨古的奶茶计划</b></font>')
label1.setAlignment(Qt.AlignRight) # 右对齐
# 如果设为True,用浏览器打开网页,如果设为False,调用槽函数(我为啥要调用槽函数啊我晕)
label2.setOpenExternalLinks(True)
label2.setAutoFillBackground(True) # 自动填充背景(可以,但没必要==)
label2.setText(
"<font color = blue><b><a href='https://space.bilibili.com/511644921'>不懂不懂我百度一下</a></b></font>")
label2_palette = QPalette()
label2_palette.setColor(QPalette.Window, Qt.lightGray) # 设置背景色
# 对label1设置调色板,这个地方好奇怪。。我前面写错成了label1,颜色就变了?
label1.setPalette(label2_palette)
label2.setAlignment(Qt.AlignRight)
label2.setToolTip('点这里鸭点这里')
'''树控件设置'''
# 为树控件指定列数
self.tree.setColumnCount(2)
# 指定列标签
self.tree.setHeaderLabels(['产品', '点击详情'])
'''根节点'''
root = QTreeWidgetItem(self.tree)
root.setText(0, '奶茶品牌') # 0代表第一列,即Key列,值为root
root.setText(1, '详细信息')
'''==================这两行不知道有用没============='''
root.setIcon(0, QIcon('../picture/bag/bag1.jpg')) # 为节点设置图标
self.tree.setColumnWidth(0, 100) # 第一列列宽设为200
'''=====这个地方应该可以弄个循环啥的吧或者读取数据之类的==='''
# 添加子节点child1
child1 = QTreeWidgetItem(root)
child1.setText(0, '喜茶') # 设置key
child1.setText(1, '1') # 设置value
child1.setIcon(0, QIcon('../picture/bag/bag2.jpg'))
# 为child1添加一个子节点child1_1
child1_1 = QTreeWidgetItem(child1)
child1_1.setText(0, '多肉桃李')
child1_1.setText(1, '1_1')
child1_1.setIcon(0, QIcon('../picture/bag/bag2.jpg'))
# 添加子节点child2
child2 = QTreeWidgetItem(root)
child2.setText(0, '柰雪的茶')
child2.setText(1, '2')
child2.setIcon(0, QIcon('../picture/bag/bag3.jpg'))
# 为child2添加一个子节点child2_1
child2_1 = QTreeWidgetItem(child2)
child2_1.setText(0, '霸气柠檬')
child2_1.setText(1, '2_1')
child2_1.setIcon(0, QIcon('../picture/bag/bag2.jpg'))
# 默认所有节点都处于展开状态
self.tree.expandAll()
'''===================信号与槽绑定================'''
self.tree.clicked.connect(self.onTreeClicked)
addBtn.clicked.connect(self.addNode)
updateBtn.clicked.connect(self.updateNode)
deleteBtn.clicked.connect(self.deleteNode)
# 布局
operatorLayout.addWidget(addBtn)
operatorLayout.addWidget(updateBtn)
operatorLayout.addWidget(deleteBtn)
browserLayout.addWidget(label1)
browserLayout.addWidget(label2)
gridLayout = QGridLayout()
gridLayout.addLayout(operatorLayout, 1, 1, 1, 3)
gridLayout.addWidget(self.tree, 2, 1, 3, 3)
gridLayout.addLayout(browserLayout, 10, 10, 1, 2)
# layout.addRow('地址', QLineEdit())
'''将第一个选项卡窗口重命名'''
self.setTabText(0, '来点喝的吧')
self.tab1.setLayout(gridLayout) # 别忘了tab1就是一个窗口
def tab2UI(self):
form2 = QFormLayout()
hbox2_1 = QHBoxLayout() # 水平布局,横向排列
hbox2_1_button1 = QPushButton('预算')
hbox2_1_button2 = QPushButton('添加')
hbox2_1_button3 = QPushButton('图表')
# 单选框
hbox2_1.addWidget(hbox2_1_button1)
hbox2_1.addWidget(hbox2_1_button2)
hbox2_1.addWidget(hbox2_1_button3)
'''表格'''
tableWidget = QTableWidget()
# 4行3列
tableWidget.setRowCount(4)
tableWidget.setColumnCount(3)
tableWidget.setHorizontalHeaderLabels(['name', 'age', 'weigh(kg)'])
textItem = QTableWidgetItem('小明')
# setItem:将文本放到单元格中
tableWidget.setItem(0, 0, textItem)
# 下拉框
combox = QComboBox()
combox.addItem('男')
combox.addItem('女')
# setStyleSheet设置控件的样式(QSS)(类似于web中的CSS),即Qt StyleSheet(n.样式表)
combox.setStyleSheet('QComboBox{margin:3px};') # 设置控键距离上下左右的单元格的距离(距离)
# setCellWidget:将控件放到单元格中
tableWidget.setCellWidget(0, 1, combox)
modifyButton = QPushButton('修改')
# 默认是按下的状态
modifyButton.setDown(True)
modifyButton.setStyleSheet('QPushButton{margin:3px};')
tableWidget.setCellWidget(0, 2, modifyButton)
'''
self.model = QStandardItemModel(10, 6) # 二维表10行5列
# 数据表的字段
self.model.setHorizontalHeaderLabels(
['日期', '星期', '收入&支出', '金额', '分类', '备注'])
self.tableView = QTableWidget()
# 关联QTableView控件和Model
self.tableView.setModel(self.model)
# 添加数据
item11 = QStandardItem('20220914') # 一个QStandardItem就是一个单元格
item12 = QStandardItem('星期三') # combobox?
item13 = QStandardItem('支出') # 应该比combobox更简单
item14 = QStandardItem('21.38') # 输入框,浮点数,两位小数
item15 = QStandardItem('餐饮') # combobox:
item16 = QStandardItem('午饭') # 长一点。。30字符?
self.model.setItem(0, 0, item11)
self.model.setItem(0, 1, item12)
self.model.setItem(0, 2, item13)
self.model.setItem(0, 3, item14)
self.model.setItem(0, 4, item15)
self.model.setItem(0, 5, item16)
'''
'''信号与槽绑定'''
hbox2_1_button1.clicked.connect(self.showDialog)
# sex.addWidget(QRadioButton('女'))
form2.addRow(hbox2_1)
form2.addRow(tableWidget)
# grid2.addRow('生日', QLineEdit())
self.setTabText(1, '记账本')
self.tab2.setLayout(form2)
def tab3UI(self):
'''创建控件的实例'''
'''1、日历'''
self.cal = QCalendarWidget(self)
# 设置允许显示的最大/小日期
self.cal.setMinimumDate(QDate(1900, 1, 1))
self.cal.setMaximumDate(QDate(2100, 1, 1))
# 以网格形式显示
self.cal.setGridVisible(True)
# 移动位置
self.cal.move(200, 200)
# # 标签
# self.label = QLabel(self)
# # 获取当前日期
# date = self.cal.selectedDate()
# # 格式化
# self.label.setText(date.toString('yyyy-MM-dd dddd')) # mm不行
# self.label.move(600, 700)
# 信号与槽
self.cal.clicked.connect(self.showDate)
'''2、日期和时间'''
self.label_dateTimeEdit1 = QLabel(self)
self.label_dateTimeEdit2 = QLabel(self)
self.label_dateEdit = QLabel(self)
self.label_timeEdit = QLabel(self)
self.label_dateTimeEdit1.setText('时间编辑')
self.label_dateTimeEdit2.setText('当前时间')
self.label_dateEdit.setText('日期')
self.label_timeEdit.setText('时间')
dateTimeEdit1 = QDateTimeEdit()
dateTimeEdit2 = QDateTimeEdit(QDateTime.currentDateTimeUtc()) # 传入当前时间
dateEdit = QDateTimeEdit(QDate.currentDate()) # 传入当前日期
timeEdit = QDateTimeEdit(QTime.currentTime()) # 传入当前日期
dateTimeEdit1.setDisplayFormat('yyyy-MM-dd HH:mm:ss')
dateTimeEdit2.setDisplayFormat('yyyy/MM/dd HH:mm:ss')
dateEdit.setDisplayFormat('yyyy.MM.dd')
timeEdit.setDisplayFormat('HH:mm:ss')
'''3、设置字体'''
self.fontBtn = QPushButton('选择字体')
self.fontLabel = QLabel('这里显示字体')
'''4、设置颜色'''
self.colorBtn = QPushButton('设置字体颜色')
self.colorBackBtn = QPushButton('设置背景颜色')
self.colorLabel_button = QLabel('这里显示字体颜色')
self.colorLabel_background = QLabel('这里显示背景颜色')
'''5、滚动条'''
self.label = QLabel(
'拖动第一个滚动条颜色变红,\n拖动第二个滚动条颜色变绿,\n拖动第三个滚动条颜色变蓝,\n拖动第四个滚动条滚动') # 文字内容
self.scrollbar1 = QScrollBar() # 滚动条
self.scrollbar2 = QScrollBar()
self.scrollbar3 = QScrollBar()
self.scrollbar4 = QScrollBar()
self.scrollbar1.setMaximum(1200) # 滚动条最大值
self.scrollbar2.setMaximum(1200)
self.scrollbar3.setMaximum(1200)
self.scrollbar4.setMaximum(1200)
'''创建栅格布局'''
grid3 = QGridLayout()
'''控件间距'''
grid3.setSpacing(100)
'''添加控件'''
# 行row,列column(可以从0开始),空间上占的行数,空间上占得列数
grid3.addWidget(self.cal, 1, 1, 3, 2)
grid3.addWidget(self.label_dateTimeEdit1, 4, 1, 1, 1)
grid3.addWidget(self.label_dateTimeEdit2, 5, 1, 1, 1)
grid3.addWidget(self.label_dateEdit, 6, 1, 1, 1)
grid3.addWidget(self.label_timeEdit, 7, 1, 1, 1)
grid3.addWidget(dateTimeEdit1, 4, 2, 1, 1)
grid3.addWidget(dateTimeEdit2, 5, 2, 1, 1)
grid3.addWidget(dateEdit, 6, 2, 1, 1)
grid3.addWidget(timeEdit, 7, 2, 1, 1)
grid3.addWidget(self.fontBtn, 1, 3, 1, 1)
grid3.addWidget(self.fontLabel, 1, 4, 1, 1)
grid3.addWidget(self.colorBtn, 2, 3, 1, 1)
grid3.addWidget(self.colorLabel_button, 2, 4, 1, 1)
grid3.addWidget(self.colorBackBtn, 3, 3, 1, 1)
grid3.addWidget(self.colorLabel_background, 3, 4, 1, 1)
grid3.addWidget(self.label, 1, 5, 7, 2)
grid3.addWidget(self.scrollbar1, 1, 7, 7, 1)
grid3.addWidget(self.scrollbar2, 1, 8, 7, 1)
grid3.addWidget(self.scrollbar3, 1, 9, 7, 1)
grid3.addWidget(self.scrollbar4, 1, 10, 7, 1)
self.y = self.label.pos().y()
'''槽'''
self.cal.clicked.connect(self.showDate)
self.fontBtn.clicked.connect(self.getFont)
self.colorBtn.clicked.connect(self.getColor)
self.colorBackBtn.clicked.connect(self.getBackColor)
self.scrollbar1.sliderMoved.connect(self.sliderMoved)
self.scrollbar2.sliderMoved.connect(self.sliderMoved)
self.scrollbar3.sliderMoved.connect(self.sliderMoved)
self.scrollbar4.sliderMoved.connect(self.sliderMoved1)
'''加布局到total上'''
self.setTabText(2, '小工具')
self.tab3.setLayout(grid3) # 加布局
'''=============================函数的分割线2=============================='''
def showDate(self, date):
# self.label.setText(date.toString('yyyy-MM-dd dddd'))
self.label.setText(self.cal.selectedDate().toString('yyyy-MM-dd dddd'))
# 2
def showDialog(self):
text = self.sender().text()
if text == '预算':
QMessageBox.about(self, '预算', '这是预算')
# 3 字体
def getFont(self):
(font, ok) = QFontDialog.getFont()
if ok:
self.fontLabel.setFont(font)
# 4、字体颜色
def getColor(self):
color = QColorDialog.getColor()
# 调色板
p = QPalette()
# 注意WindowText(这是类属性,常量)的大小写,这是常量,别选错了!!!!
p.setColor(QPalette.WindowText, color)
# pycharm中自动补全代码提示前符号(eg:f是Field,类属性,常量)的意思:https://blog.csdn.net/lemon4869/article/details/101263102
# print('QPalette.WindowText =',QPalette.WindowText )
# print('QPalette.Window =',QPalette.Window)
print('QPalette.WindowText =', QPalette.WindowText)
print('QPalette.Window =', QPalette.Window)
self.colorLabel_button.setPalette(p)
# 5、背景颜色
def getBackColor(self):
color = QColorDialog.getColor()
p = QPalette()
p.setColor(QPalette.Window, color)
# 自动填充背景
self.colorLabel_background.setAutoFillBackground(True)
self.colorLabel_background.setPalette(p)
# 6、树的槽
def onTreeClicked(self, index): # index是被点击节点的索引
item = self.tree.currentItem() # 获得当前单击项
print('当前处于第%d行' % index.row()) # 输出当前行(自己父节点的第几个值)
print('key=%s,value=%s' % (item.text(0), item.text(1)))
print()
# 1-1 添加节点
def addNode(self):
print('添加节点')
item = self.tree.currentItem() # 获得当前结点
print('当前节点是:', item)
node = QTreeWidgetItem(item)
node.setText(0, '新节点')
node.setText(1, '新值')
# 1-2 修改节点
def updateNode(self):
print('修改节点')
item = self.tree.currentItem()
item.setText(0, '修改节点')
item.setText(1, '值已经被修改')
# 1-3 删除节点
def deleteNode(self):
print('删除节点')
# 防止item是root时,root无父结点报错,要使用下面的写法
rootFather = self.tree.invisibleRootItem() # 获得根节点root的不可见的父节点
for item in self.tree.selectedItems():
# 父节点不为空
(item.parent() or rootFather).removeChild(item)
# 3-1 滚动条变颜色
def sliderMoved(self):
print(self.scrollbar1.value(),
self.scrollbar2.value(), self.scrollbar3.value())
# 调色版
palette = QPalette()
# 最后一个参数是透明度
c = QColor(self.scrollbar1.value(), self.scrollbar2.value(),
self.scrollbar3.value(), 255)
# 参数一:QPalette.Foreground设置前景色,即标签的颜色 参数2:颜色
palette.setColor(QPalette.Foreground, c)
self.label.setPalette(palette)
# 3-2 滚动条上下移动
def sliderMoved1(self):
# 向下移动标签
self.label.move(self.label.x(), self.y + self.scrollbar4.value())
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setWindowIcon(QIcon('icon/icon.jpeg'))
main = FirstMainWin()
main.show()
sys.exit(app.exec_())
0914——
于 2022-09-14 17:37:30 首次发布