0914——

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_())

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值