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 = QHBoxLayout()
browserLayout = QVBoxLayout()
addBtn = QPushButton('添加节点')
updateBtn = QPushButton('修改节点')
deleteBtn = QPushButton('删除节点')
self.tree = QTreeWidget() # 树
label1 = QLabel(self)
label2 = QLabel(self)
self.btn1_pic = QPushButton('加载图片')
self.btn2_file = QPushButton('加载文本文件')
# 用标签来作为显示图片的地方
self.imageLabel = QLabel()
# 多行编辑框
self.contents = QTextEdit()
self.dialog = QFileDialog()
'''=====================控件设置====================='''
'''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, 500) # 第一列列宽设为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)
self.btn1_pic.clicked.connect(self.loadImage)
self.btn2_file.clicked.connect(self.loadText)
# 布局
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, 5, 3)
gridLayout.addWidget(self.btn1_pic, 1, 6, 1, 1)
gridLayout.addWidget(self.btn2_file, 1, 12, 1, 1)
gridLayout.addWidget(self.imageLabel, 2, 5, 5, 5)
gridLayout.addLayout(browserLayout, 15, 15, 1, 2)
gridLayout.addWidget(self.contents, 2, 11, 5, 5)
# 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(10)
tableWidget.setColumnCount(6)
tableWidget.setHorizontalHeaderLabels(
['日期', '星期', '收入/支出', '金额(元)', '分类', '备注'])
textItem = QTableWidgetItem('20220914')
# setItem:将文本放到单元格中
tableWidget.setItem(0, 0, textItem)
# combox设置
combox_week2 = QComboBox()
combox_week2.addItem('星期1')
combox_week2.addItem('星期2')
combox_week2.addItem('星期3')
combox_week2.addItem('星期4')
combox_week2.addItem('星期5')
combox_week2.addItem('星期六')
combox_week2.addItem('星期日')
combox_3 = QComboBox()
combox_3.addItem('收入')
combox_3.addItem('支出')
combox_5 = QComboBox()
combox_5.addItem('餐饮')
combox_5.addItem('交通')
combox_5.addItem('服饰')
combox_5.addItem('购物')
combox_5.addItem('服务')
combox_5.addItem('教育')
combox_5.addItem('游戏')
combox_5.addItem('运动')
combox_5.addItem('生活缴费')
combox_5.addItem('旅行')
combox_5.addItem('医疗')
combox_5.addItem('人情')
combox_5.addItem('保险')
combox_5.addItem('其他')
# setStyleSheet设置控件的样式(QSS)(类似于web中的CSS),即Qt StyleSheet(n.样式表)
combox_week2.setStyleSheet(
'QComboBox{margin:3px};') # 设置控键距离上下左右的单元格的距离(距离)
# 设置控键距离上下左右的单元格的距离(距离)
combox_3.setStyleSheet('QComboBox{margin:3px};')
# 设置控键距离上下左右的单元格的距离(距离)
combox_5.setStyleSheet('QComboBox{margin:3px};')
# setCellWidget:将控件放到单元格中
tableWidget.setCellWidget(0, 1, combox_week2)
tableWidget.setCellWidget(1, 1, combox_week2)
tableWidget.setCellWidget(2, 1, combox_week2)
tableWidget.setCellWidget(3, 1, combox_week2)
tableWidget.setCellWidget(4, 1, combox_week2)
tableWidget.setCellWidget(5, 1, combox_week2)
tableWidget.setCellWidget(6, 1, combox_week2)
tableWidget.setCellWidget(7, 1, combox_week2)
tableWidget.setCellWidget(8, 1, combox_week2)
tableWidget.setCellWidget(9, 1, combox_week2)
tableWidget.setCellWidget(10, 1, combox_week2)
tableWidget.setCellWidget(0, 2, combox_3)
tableWidget.setCellWidget(1, 2, combox_3)
tableWidget.setCellWidget(2, 2, combox_3)
tableWidget.setCellWidget(3, 2, combox_3)
tableWidget.setCellWidget(4, 2, combox_3)
tableWidget.setCellWidget(5, 2, combox_3)
tableWidget.setCellWidget(6, 2, combox_3)
tableWidget.setCellWidget(7, 2, combox_3)
tableWidget.setCellWidget(8, 2, combox_3)
tableWidget.setCellWidget(9, 2, combox_3)
tableWidget.setCellWidget(10, 2, combox_3)
tableWidget.setCellWidget(0, 4, combox_5)
tableWidget.setCellWidget(1, 4, combox_5)
tableWidget.setCellWidget(2, 4, combox_5)
tableWidget.setCellWidget(3, 4, combox_5)
tableWidget.setCellWidget(4, 4, combox_5)
tableWidget.setCellWidget(5, 4, combox_5)
tableWidget.setCellWidget(6, 4, combox_5)
tableWidget.setCellWidget(7, 4, combox_5)
tableWidget.setCellWidget(8, 4, combox_5)
tableWidget.setCellWidget(9, 4, combox_5)
tableWidget.setCellWidget(10, 4, combox_5)
# 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):
'''创建控件的实例,注意Mac与windows的布局问题'''
'''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_rightnow_time = QLabel('显示当前时间')
self.startBtn = QPushButton('开始')
self.endBtn = QPushButton('结束')
# 计时器对象
self.timer = QTimer()
self.timer.timeout.connect(self.showrightnowTime)
'''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开始),空间上占的行数,空间上占得列数
# button可以不设置长度的,直接写坐标就好了
grid3.addWidget(self.cal, 1, 1, 5, 3)
grid3.addWidget(self.label_dateTimeEdit1, 1, 4, 1, 1)
grid3.addWidget(self.label_dateTimeEdit2, 2, 4, 1, 1)
grid3.addWidget(self.label_dateEdit, 3, 4, 1, 1)
grid3.addWidget(self.label_timeEdit, 4, 4, 1, 1)
grid3.addWidget(self.label_rightnow_time, 5, 4, 1, 1)
grid3.addWidget(dateTimeEdit1, 1, 5, 1, 1)
grid3.addWidget(dateTimeEdit2, 2, 5, 1, 1)
grid3.addWidget(dateEdit, 3, 5, 1, 1)
grid3.addWidget(timeEdit, 4, 5, 1, 1)
grid3.addWidget(self.startBtn, 5, 5, 1, 1)
grid3.addWidget(self.endBtn, 5, 6, 1, 1)
grid3.addWidget(self.fontBtn, 1, 7, 1, 1)
grid3.addWidget(self.fontLabel, 1, 8, 1, 1)
grid3.addWidget(self.colorBtn, 2, 7, 1, 1)
grid3.addWidget(self.colorLabel_button, 2, 8, 1, 1)
grid3.addWidget(self.colorBackBtn, 3, 7, 1, 1)
grid3.addWidget(self.colorLabel_background, 3, 8, 1, 1)
grid3.addWidget(self.label, 1, 9, 7, 2)
grid3.addWidget(self.scrollbar1, 1, 11, 7, 1)
grid3.addWidget(self.scrollbar2, 1, 12, 7, 1)
grid3.addWidget(self.scrollbar3, 1, 13, 7, 1)
grid3.addWidget(self.scrollbar4, 1, 14, 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)
self.startBtn.clicked.connect(self.startTimer)
self.endBtn.clicked.connect(self.endTimer)
'''加布局到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)
# 1-4、树的槽
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())
# 3-3 动态时间:显示当前时间
def showrightnowTime(self):
time = QDateTime.currentDateTime()
# dddd是星期几
timeDispaly = time.toString('yyyy-MM-dd hh:mm:ss dddd')
# 将标签设置成当前时间
self.label.setText(timeDispaly)
# 3-4 动态时间,
def startTimer(self):
# 参数是时间间隔,1000毫秒
self.timer.start(1000)
self.startBtn.setEnabled(False) # 不能按
self.endBtn.setEnabled(True) # 可以按
# 3-5 停止计时
def endTimer(self):
# 停止计时
self.timer.stop()
self.startBtn.setEnabled(True)
self.endBtn.setEnabled(False)
# 1-6 文件图片对话框-槽函数
def loadImage(self):
# 参数三是默认路径(自己随便设),参数四是过滤哪些文件,比如下面就是只显示jpg或者png文件
#fname,a=QFileDialog.getOpenFileName(self,'打开文件','.','图像文件(*.jpg *.png)')
fname, _ = QFileDialog.getOpenFileName(
self, '打开文件', 'D:\\', '图像文件(*.jpg *.png)')
print(fname)
print(_)
self.imageLabel.setPixmap(QPixmap(fname))
# 1-7 文件图片对话框-设置过滤器
def loadText(self):
# 设置打开文件模式
self.dialog.setFileMode(QFileDialog.AnyFile) # 任何文件
# 设置过滤器,只显示过滤器允许的文件类型
self.dialog.setFilter(QDir.Files) # ?????????
if self.dialog.exec():
# 选择文件
filenames = self.dialog.selectedFiles()
print(filenames) # 列表,就一个元素,就是选中的文件的绝对路径
f = open(filenames[0], mode='r', encoding='utf-8') # 打开第一个文件
# with会自动调用文件的close()函数,防止我们忘记
with f:
data = f.read()
self.contents.setText(data)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setWindowIcon(QIcon('icon/icon.jpeg'))
main = FirstMainWin()
main.show()
sys.exit(app.exec_())
'''
附录:
茶底/奶/椰,冰糖浆,水果,冰块和水,果汁,小料,芝士
1、喜茶
芝芝桃桃,芝芝莓莓,芝芝莓莓桃,芝芝芒芒,芝士绿妍,功夫红豆双皮奶,多肉芒芒甘露,多肉杨梅,多肉葡萄,绿爆柠
多肉黄皮,雪山思乡龙眼,满杯橙橙,满杯红柚,多肉荔枝,芋泥波波牛乳,超厚牛乳波波,豆豆波波茶,生打椰椰奶冻,雪山满陇金桂,酒酿桂花冻
'''
11
# 都是mainwindow的,到时候开个单独的窗口试一下
# Mac系统好像显示有问题,去windows试一下吧
12
'''
12_1 显示表格没有什么问题,问题在怎么设置函数和连接button2上,应该有设置combox和增删改查的方法吧,
12_2、12_3、12_4没懂。。
12_1 和12_5 很多不一样。。
'''
14
'''
目前的问题:
0、槽函数的调用
1、mainwindow添加不上控件:
14_1_48 self.setCentralWidget(self.tree) # 将树控件设为中心控件,即树控件会自动铺满整个屏幕
2、添加节点的时候的循环问题(数据读取问题)
3、value除了汉字支不支持其它格式的问题,能否连接对应槽
4、模版的改动问题
5、没有用过的功能
14_1_24 self.tree.setColumnWidth(0, 200) # 第一列列宽设为200 是否生效
14_1_32 child1.setCheckState(0, Qt.Checked) # 设置子节点1开启复选框状态
'''
18
# 18_1 绝对布局就是把控件直接.move(x,y)
self.setWindowTitle('绝对布局')
self.resize(300, 200) # 与geometry的区别啥的
self.label1 = QLabel('欢迎', self)
self.label1.move(15, 20)
# 18_2/4 水平布局/垂直
# 设置控件之间的间距
hlayout.setSpacing(40)
# 老问题,布局叠加
# 18_3 设置控件的对齐方式(可以试一下)
'''
参数二:拉伸量(几个单位),eg:按钮1后面有2个单位的拉伸,按钮2后面有4个单位的拉伸
参数三:对齐方式,eg:按钮1是按照左上方对齐,其他以此类推
'''
hlayout.addWidget(QPushButton('按钮1'), 2, Qt.AlignLeft | Qt.AlignTop)
hlayout.addWidget(QPushButton('按钮2'), 4, Qt.AlignLeft | Qt.AlignTop)
hlayout.addWidget(QPushButton('按钮3'), 1, Qt.AlignLeft | Qt.AlignTop)
hlayout.addWidget(QPushButton('按钮4'), 1, Qt.AlignLeft | Qt.AlignBottom)
hlayout.addWidget(QPushButton('按钮5'), 1, Qt.AlignLeft | Qt.AlignBottom)
# 18_5
https://blog.csdn.net/xiaodingqq/article/details/78988339
# 伸缩量,在水平布局里有讲过
layout.addStretch(1) # 在按钮前面添加伸缩单位
16
# mac系统16_2控件不显示。字体。颜色等控件显示也有问题,
# 16_1 滚动条长度设置有问题
# 16-2 没有在windows系统下实验是否能使用
# 16-3 没有实验因为不知道这个窗口是什么窗口
# 16-4 多个函数多个类不知道怎么办
8
# 8_6 图片加载的时候,由于放在栅格里,默认居中,影响观感,可考虑把label换成别的还是(图片设置成相同大小)
# tab-1 栅格布局,设计一下
''''''
'''
# 一、pyQt5入门
一.介绍
1.建议
二.简述
1.QApplication
2. sys.exit(app.exec_())
三.安装与外部工具的设置
四. 将.ui文件转化成.py文件
1.法一(命令行)
2.法二(配置PYUCI插件)
# 二、pyQt5入门
一.在QtDesigner中使用水平布局
二.在QtDesigner中使用垂直布局
三.向栅格布局中拖动控件
四.在QtDesigner中同时使用水平布局和垂直布局
五.在QtDesigner中同时使用栅格布局并向其中拖动控件
六.表单布局
七.在容器中完成布局
八.绝对布局
# 三、PyQt5入门
一、分割线与间隔
二、尺寸策略
三、控件之间的伙伴关系
四、Tab顺序
# 四、信号与槽
# 五、纯代码
主窗口类型(3种):
让主窗口居中
退出应用程序
屏幕坐标系
设置窗口和应用程序图标
控件提示信息
# 六、常用控件
QLabel
基本用法
伙伴关系
QLineEdit控件与回显模式
限制QLineEdit控件的输入
校验器
掩码
QLineEdit综合案例
使用QTextEdit控件输入多行文本
# 七、常用控件
按钮控件(QpushButton)
单选按钮控件QRatioButton
复选框控件QCheckBox (茶,奶,椰奶,)
下拉列表控件ComboBox
滑块控件QSlider
滑块步长和间隔的区别
计数器控件QSpinBox
# 八、对话框
@ 对话框: QDialog
Python对象比较(is&==)
id
type
value
消息对话框 QMessageBox
输入对话框QInputDialog
@ 字体对话框QFontDialog
@ 颜色对话框QColorDialog
@ 文件对话框QFileDialog(怪有用)
QFileDialog类中的常用方法
# 十、拖拽&剪贴板&日历&日期和时间
一.让控件支持拖拽动作
二.使用剪贴板
@ 三.日历控件
@ 四.设置不同风格的日期和时间
五.日期和时间控件的高级操作
# 十一、菜单栏 & 工具栏 & 状态栏 &使用打印机 &显示打印对话框(含输出为PDF)
! 一.创建和使用菜单
! 二.创建和使用工具栏
! 三.创建和使用状态栏
! 四.使用打印机
! 五.显示打印对话框
# 十二、复杂控件 视图 & MVC设计模式 & 表格(上)
一.显示二维表数据
二.显示列数据
三.扩展的列表控件
四.扩展的表格控件
五.在单元格中放置控件
六.在表格中搜索Cell和行定位
七.设置单元格字体和颜色
八.按表格的某一列排序
# 十三、表格 & 单元格(下)
一.设置单元格的文本对齐方式
二.合并单元格
三.设置单元格的尺寸
四.在单元格中实现图文混排的效果
五.改变单元格中图片的尺寸
六.在表格中显示上下文菜单
# 十四、树控件QTreeWidget
@ 二.树控件(QTreeWidget)基本用法
@ 三.为树节点添加响应时间
@ 四.增加,修改和删除树控件的节点
@ 五.QTreeView控件与系统定制模式
# 十五、容器控件
@ 一.选项卡控件QTabWidget
二.堆栈窗口控件QStackedWidget
三.停靠控件QDockWidget
四.容纳多文档的窗口
# 十六、滚动条 & 动态显示当前时间 & 窗口定时关闭 & 线程类编写计数器
@ 二.滚动条控件QScrollBar
@ 三.动态显示当前时间
四.让窗口定时关闭
五.使用线程类(QThread)编写计数器
# 十八、布局
! 二.绝对布局
! 三.水平盒布局(QHBoxLayout)
! 四.设置控件的对齐方式
! 五.垂直盒布局
! 六.设置布局的伸缩量
# 十九 布局
一.让按钮永远在窗口的右下角
二.栅格布局:用循环方式实现计算器UI
三.栅格布局:进行表单UI设计
四.表单布局
五.拖动控件之间的边界(QSplitter)
# 二十、信号与槽(上)
一.信号与槽基础
二.自定义信号实现对象之间的通信
三.可以传递多个参数的信号
四.为类添加多个信号(重载形式的信号)
五.信号与槽的N对N连接与断开连接
# 二十一 信号与槽(中)
一.为窗口添加信号
二.多线程更新UI数据
三.信号与槽自动连接
四.用Lambda表达式为槽函数传递参数
五.用partial对象为槽函数传递参数
六.override(覆盖)槽函数
# 二十二 信号与槽下
一.多窗口交互(1):不使用信号与槽
二.多窗口交互(2):使用信号与槽
# 二十八 用PyInstaller打包PyQt5应用 & 使用PyQtGraph进行数据可视化
一.用PyInstaller打包PyQt5应用
二.使用PyQtGraph进行数据可视化
# 二十九 SQLite数据库
一.操作SQLite数据库
二.使用可视化的方式对SQLite数据库进行增删改查操作
三.分页显示数据
‘’‘----------------------paint---------------------’‘’
# 九、绘图
绘制文本
用像素点绘制正弦曲线
绘制不同类型的直线
绘制各种图形
用画刷填充图形区域
# 十七 Web & JavaScript
一.用Web浏览器控件(QWebEngineView)显示网页
二.装载本地Web页面
三.显示嵌入Web页面
四.PyQt5调用JavaScript代码,并返回值
五.JavaScript调用PyhtonAPI计算阶乘
# 二十三 窗口,绘图与特效
一.设置窗口中控件的风格
二.设置窗口样式
三.用代码设置窗口的最大化和最小化
四.项目实战:实现绘图应用
五.创建透明和半透明窗口
# 二十四 QSS
一.QSS基础
二.使用QSS选择器设置控件样式
三.QSS子控件选择器
四. 使用QSS为标签和按钮添加背景图
五.装载QSS文件
# 二十五 QSS三种设置背景色和背景图片的方式
一.方式一 QSS
二.方式二 QPalette
三.方式三 直接绘制
# 二十六 异形窗口
一.实现不规则窗口(异形窗口)
二.移动和关闭不规则窗口(异形窗口)
三. 实现异形窗口动画效果
# 二十七 装载gif动画文件 & 缩放图片 & 动画效果操作窗口
一.装载gif动画文件
二.缩放图片
三.用动画效果改变窗口的尺寸
四.用动画效果——不同速度移动窗口
'''