Pyqt5经典案例学习

news2024/11/27 8:43:00

目录

  • 前言
  • 一、图表主题动画
    • 1-1、效果展示
    • 1-2、代码分段解析
      • 1-2-1、导库
      • 1-2-2、初始化
      • 1-2-3、数据生成函数以及信号与槽的连接
  • 总结


前言

案例来源于GitHub项目《各种各样的PyQt测试和例子》

一、图表主题动画

1-1、效果展示

功能

  • 支持不同的主题和动画效果。
  • 用户可以通过下拉框选择主题和动画效果,也可以勾选复选框来打开或关闭抗锯齿效果。
  • 创建了多个图表,包括区域图、柱状图、折线图、饼图、散点图和样条图。

在这里插入图片描述
完整代码如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 2019/10/2
@author: Irony
@site: https://pyqt.site , https://github.com/PyQt5
@email: 892768447@qq.com
@file: ChartThemes
@description: 图表主题动画等
"""
#############################################################################
##
## Copyright (C) 2013 Riverbank Computing Limited
## Copyright (C) 2012 Digia Plc
## All rights reserved.
##
## This file is part of the PyQtChart examples.
##
## $QT_BEGIN_LICENSE$
## Licensees holding valid Qt Commercial licenses may use this file in
## accordance with the Qt Commercial License Agreement provided with the
## Software or, alternatively, in accordance with the terms contained in
## a written agreement between you and Digia.
## $QT_END_LICENSE$
##
#############################################################################


import random

try:
    from PyQt5.QtChart import (QAreaSeries, QBarSet, QChart, QChartView,
                               QLineSeries, QPieSeries, QScatterSeries, QSplineSeries,
                               QStackedBarSeries)
    from PyQt5.QtCore import pyqtSlot, QPointF, Qt
    from PyQt5.QtGui import QColor, QPainter, QPalette
    from PyQt5.QtWidgets import QApplication, QMainWindow, QCheckBox, QComboBox, QGridLayout, QHBoxLayout, \
        QLabel, QSizePolicy, QWidget
except ImportError:
    from PySide2.QtCore import Slot as pyqtSlot, QPointF, Qt
    from PySide2.QtGui import QColor, QPainter, QPalette
    from PySide2.QtWidgets import QApplication, QMainWindow, QCheckBox, QComboBox, QGridLayout, QHBoxLayout, \
        QLabel, QSizePolicy, QWidget
    from PySide2.QtCharts import QtCharts

    QChartView = QtCharts.QChartView
    QChart = QtCharts.QChart
    QAreaSeries = QtCharts.QAreaSeries
    QBarSet = QtCharts.QBarSet
    QLineSeries = QtCharts.QLineSeries
    QPieSeries = QtCharts.QPieSeries
    QScatterSeries = QtCharts.QScatterSeries
    QSplineSeries = QtCharts.QSplineSeries
    QStackedBarSeries = QtCharts.QStackedBarSeries


class ThemeWidget(QWidget):

    def __init__(self, parent=None):
        super(ThemeWidget, self).__init__(parent)

        self.m_charts = []
        self.m_listCount = 3
        self.m_valueMax = 10
        self.m_valueCount = 7
        self.m_dataTable = self.generateRandomData(self.m_listCount,
                                                   self.m_valueMax, self.m_valueCount)
        self.m_themeComboBox = self.createThemeBox()
        self.m_antialiasCheckBox = QCheckBox("Anti-aliasing")
        self.m_animatedComboBox = self.createAnimationBox()
        self.m_legendComboBox = self.createLegendBox()

        self.connectSignals()

        # Create the layout.
        baseLayout = QGridLayout()
        settingsLayout = QHBoxLayout()
        settingsLayout.addWidget(QLabel("Theme:"))
        settingsLayout.addWidget(self.m_themeComboBox)
        settingsLayout.addWidget(QLabel("Animation:"))
        settingsLayout.addWidget(self.m_animatedComboBox)
        settingsLayout.addWidget(QLabel("Legend:"))
        settingsLayout.addWidget(self.m_legendComboBox)
        settingsLayout.addWidget(self.m_antialiasCheckBox)
        settingsLayout.addStretch()
        baseLayout.addLayout(settingsLayout, 0, 0, 1, 3)

        # Create the charts.
        chartView = QChartView(self.createAreaChart())
        baseLayout.addWidget(chartView, 1, 0)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createBarChart(self.m_valueCount))
        baseLayout.addWidget(chartView, 1, 1)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createLineChart())
        baseLayout.addWidget(chartView, 1, 2)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createPieChart())
        # Funny things happen if the pie slice labels no not fit the screen...
        chartView.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        baseLayout.addWidget(chartView, 2, 0)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createSplineChart())
        baseLayout.addWidget(chartView, 2, 1)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createScatterChart())
        baseLayout.addWidget(chartView, 2, 2)
        self.m_charts.append(chartView)

        self.setLayout(baseLayout)

        # Set the defaults.
        self.m_antialiasCheckBox.setChecked(True)
        self.updateUI()

    def connectSignals(self):
        self.m_themeComboBox.currentIndexChanged.connect(self.updateUI)
        self.m_antialiasCheckBox.toggled.connect(self.updateUI)
        self.m_animatedComboBox.currentIndexChanged.connect(self.updateUI)
        self.m_legendComboBox.currentIndexChanged.connect(self.updateUI)

    def generateRandomData(self, listCount, valueMax, valueCount):
        random.seed()

        dataTable = []

        for i in range(listCount):
            dataList = []
            yValue = 0.0
            f_valueCount = float(valueCount)

            for j in range(valueCount):
                yValue += random.uniform(0, valueMax) / f_valueCount
                value = QPointF(
                    j + random.random() * self.m_valueMax / f_valueCount,
                    yValue)
                label = "Slice " + str(i) + ":" + str(j)
                dataList.append((value, label))

            dataTable.append(dataList)

        return dataTable

    def createThemeBox(self):
        themeComboBox = QComboBox()

        themeComboBox.addItem("Light", QChart.ChartThemeLight)
        themeComboBox.addItem("Blue Cerulean", QChart.ChartThemeBlueCerulean)
        themeComboBox.addItem("Dark", QChart.ChartThemeDark)
        themeComboBox.addItem("Brown Sand", QChart.ChartThemeBrownSand)
        themeComboBox.addItem("Blue NCS", QChart.ChartThemeBlueNcs)
        themeComboBox.addItem("High Contrast", QChart.ChartThemeHighContrast)
        themeComboBox.addItem("Blue Icy", QChart.ChartThemeBlueIcy)

        return themeComboBox

    def createAnimationBox(self):
        animationComboBox = QComboBox()

        animationComboBox.addItem("No Animations", QChart.NoAnimation)
        animationComboBox.addItem("GridAxis Animations", QChart.GridAxisAnimations)
        animationComboBox.addItem("Series Animations", QChart.SeriesAnimations)
        animationComboBox.addItem("All Animations", QChart.AllAnimations)

        return animationComboBox

    def createLegendBox(self):
        legendComboBox = QComboBox()

        legendComboBox.addItem("No Legend ", 0)
        legendComboBox.addItem("Legend Top", Qt.AlignTop)
        legendComboBox.addItem("Legend Bottom", Qt.AlignBottom)
        legendComboBox.addItem("Legend Left", Qt.AlignLeft)
        legendComboBox.addItem("Legend Right", Qt.AlignRight)

        return legendComboBox

    def createAreaChart(self):
        chart = QChart()
        chart.setTitle("Area chart")

        # The lower series is initialized to zero values.
        lowerSeries = None
        y_points = []

        for i, data_list in enumerate(self.m_dataTable):
            upperSeries = QLineSeries(chart)
            for j, (value, _) in enumerate(data_list):
                y = value.y()

                if lowerSeries is None:
                    upperSeries.append(QPointF(j, y))
                    y_points.append(y)
                else:
                    new_y = y_points[i] + y
                    upperSeries.append(QPointF(j, new_y))
                    y_points[j] += new_y

            area = QAreaSeries(upperSeries, lowerSeries)
            area.setName("Series " + str(i))
            chart.addSeries(area)
            lowerSeries = upperSeries

        chart.createDefaultAxes()

        return chart

    def createBarChart(self, valueCount):
        chart = QChart()
        chart.setTitle("Bar chart")

        series = QStackedBarSeries(chart)

        for i, data_list in enumerate(self.m_dataTable):
            set = QBarSet("Bar set " + str(i))
            for value, _ in data_list:
                set << value.y()

            series.append(set)

        chart.addSeries(series)
        chart.createDefaultAxes()

        return chart

    def createLineChart(self):
        chart = QChart()
        chart.setTitle("Line chart")

        for i, data_list in enumerate(self.m_dataTable):
            series = QLineSeries(chart)
            for value, _ in data_list:
                series.append(value)

            series.setName("Series " + str(i))
            chart.addSeries(series)

        chart.createDefaultAxes()

        return chart

    def createPieChart(self):
        chart = QChart()
        chart.setTitle("Pie chart")

        pieSize = 1.0 / len(self.m_dataTable)

        for i, data_list in enumerate(self.m_dataTable):
            series = QPieSeries(chart)
            for value, label in data_list:
                slice = series.append(label, value.y())
                if series.count() == 1:
                    slice.setLabelVisible()
                    slice.setExploded()

            hPos = (pieSize / 2) + (i / float(len(self.m_dataTable)))
            series.setPieSize(pieSize)
            series.setHorizontalPosition(hPos)
            series.setVerticalPosition(0.5)

            chart.addSeries(series)

        return chart

    def createSplineChart(self):
        chart = QChart()
        chart.setTitle("Spline chart")

        for i, data_list in enumerate(self.m_dataTable):
            series = QSplineSeries(chart)
            for value, _ in data_list:
                series.append(value)

            series.setName("Series " + str(i))
            chart.addSeries(series)

        chart.createDefaultAxes()

        return chart

    def createScatterChart(self):
        chart = QChart()
        chart.setTitle("Scatter chart")

        for i, data_list in enumerate(self.m_dataTable):
            series = QScatterSeries(chart)
            for value, _ in data_list:
                series.append(value)

            series.setName("Series " + str(i))
            chart.addSeries(series)

        chart.createDefaultAxes()

        return chart

    @pyqtSlot()
    def updateUI(self):
        theme = self.m_themeComboBox.itemData(
            self.m_themeComboBox.currentIndex())

        if self.m_charts[0].chart().theme() != theme:
            for chartView in self.m_charts:
                chartView.chart().setTheme(QChart.ChartTheme(theme))

            pal = self.window().palette()

            if theme == QChart.ChartThemeLight:
                pal.setColor(QPalette.Window, QColor(0xf0f0f0))
                pal.setColor(QPalette.WindowText, QColor(0x404044))
            elif theme == QChart.ChartThemeDark:
                pal.setColor(QPalette.Window, QColor(0x121218))
                pal.setColor(QPalette.WindowText, QColor(0xd6d6d6))
            elif theme == QChart.ChartThemeBlueCerulean:
                pal.setColor(QPalette.Window, QColor(0x40434a))
                pal.setColor(QPalette.WindowText, QColor(0xd6d6d6))
            elif theme == QChart.ChartThemeBrownSand:
                pal.setColor(QPalette.Window, QColor(0x9e8965))
                pal.setColor(QPalette.WindowText, QColor(0x404044))
            elif theme == QChart.ChartThemeBlueNcs:
                pal.setColor(QPalette.Window, QColor(0x018bba))
                pal.setColor(QPalette.WindowText, QColor(0x404044))
            elif theme == QChart.ChartThemeHighContrast:
                pal.setColor(QPalette.Window, QColor(0xffab03))
                pal.setColor(QPalette.WindowText, QColor(0x181818))
            elif theme == QChart.ChartThemeBlueIcy:
                pal.setColor(QPalette.Window, QColor(0xcee7f0))
                pal.setColor(QPalette.WindowText, QColor(0x404044))
            else:
                pal.setColor(QPalette.Window, QColor(0xf0f0f0))
                pal.setColor(QPalette.WindowText, QColor(0x404044))

            self.window().setPalette(pal)

        checked = self.m_antialiasCheckBox.isChecked()
        for chartView in self.m_charts:
            chartView.setRenderHint(QPainter.Antialiasing, checked)

        options = QChart.AnimationOptions(
            self.m_animatedComboBox.itemData(
                self.m_animatedComboBox.currentIndex()))

        if self.m_charts[0].chart().animationOptions() != options:
            for chartView in self.m_charts:
                chartView.chart().setAnimationOptions(options)

        alignment = self.m_legendComboBox.itemData(
            self.m_legendComboBox.currentIndex())

        for chartView in self.m_charts:
            legend = chartView.chart().legend()

            if alignment == 0:
                legend.hide()
            else:
                legend.setAlignment(Qt.Alignment(alignment))
                legend.show()


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = QMainWindow()
    widget = ThemeWidget()
    window.setCentralWidget(widget)
    window.resize(900, 600)
    window.show()

    sys.exit(app.exec_())

1-2、代码分段解析

1-2-1、导库

PyQt5和PySide2都是Python中使用Qt框架的工具包,它们提供了对Qt库的Python绑定。它们的主要区别在于它们的开发和使用许可证不同。PyQt5是由Riverbank Computing有限公司开发的,使用的是GPL和商业许可证,而PySide2是由Qt公司开发的,使用的是LGPL许可证。此外,PyQt5包含了Qt的全部功能,而PySide2只包含了其中的一部分。

在使用上,两者提供了类似的API和功能,但PyQt5相对而言更稳定,文档和教程也更全面,因为它已经存在更长的时间并且有更多的用户和开发者。但是,由于PySide2使用的是LGPL许可证,因此在一些特定的情况下,可能更适合某些项目的使用。

import random

try:
    from PyQt5.QtChart import (QAreaSeries, QBarSet, QChart, QChartView,
                               QLineSeries, QPieSeries, QScatterSeries, QSplineSeries,
                               QStackedBarSeries)
    from PyQt5.QtCore import pyqtSlot, QPointF, Qt
    from PyQt5.QtGui import QColor, QPainter, QPalette
    from PyQt5.QtWidgets import QApplication, QMainWindow, QCheckBox, QComboBox, QGridLayout, QHBoxLayout, \
        QLabel, QSizePolicy, QWidget
except ImportError:
    from PySide2.QtCore import Slot as pyqtSlot, QPointF, Qt
    from PySide2.QtGui import QColor, QPainter, QPalette
    from PySide2.QtWidgets import QApplication, QMainWindow, QCheckBox, QComboBox, QGridLayout, QHBoxLayout, \
        QLabel, QSizePolicy, QWidget
    from PySide2.QtCharts import QtCharts

    QChartView = QtCharts.QChartView
    QChart = QtCharts.QChart
    QAreaSeries = QtCharts.QAreaSeries
    QBarSet = QtCharts.QBarSet
    QLineSeries = QtCharts.QLineSeries
    QPieSeries = QtCharts.QPieSeries
    QScatterSeries = QtCharts.QScatterSeries
    QSplineSeries = QtCharts.QSplineSeries
    QStackedBarSeries = QtCharts.QStackedBarSeries

1-2-2、初始化

这段代码定义了一个名为ThemeWidget的QWidget类,用于展示多种不同主题下的图表,并提供一些设置选项。

  • 在初始化函数__init__中,先设置了一些属性,如图表个数、数值最大值、数值数量、数据表,以及一些UI控件,如主题下拉框、抗锯齿复选框、动画效果下拉框、图例下拉框,并连接它们的信号与槽函数。
  • 然后,通过QGridLayout布局管理器来创建一个基础布局,并在其中添加一些UI控件和图表视图,分别包括区域图、条形图、折线图、饼图、样条图、散点图。其中,每个图表都被包装在QChartView中。
  • 最后,将基础布局设置为ThemeWidget的布局,并设置抗锯齿复选框默认选中,并调用updateUI函数来更新UI。

代码如下

class ThemeWidget(QWidget):

    def __init__(self, parent=None):
        super(ThemeWidget, self).__init__(parent)

        self.m_charts = []
        self.m_listCount = 3
        self.m_valueMax = 10
        self.m_valueCount = 7
        # 数据生成函数
        self.m_dataTable = self.generateRandomData(self.m_listCount,
                                                   self.m_valueMax, self.m_valueCount)
        self.m_themeComboBox = self.createThemeBox()
        self.m_antialiasCheckBox = QCheckBox("Anti-aliasing")
        self.m_animatedComboBox = self.createAnimationBox()
        self.m_legendComboBox = self.createLegendBox()

        self.connectSignals()

        # Create the layout.
        baseLayout = QGridLayout()
        settingsLayout = QHBoxLayout()
        settingsLayout.addWidget(QLabel("Theme:"))
        settingsLayout.addWidget(self.m_themeComboBox)
        settingsLayout.addWidget(QLabel("Animation:"))
        settingsLayout.addWidget(self.m_animatedComboBox)
        settingsLayout.addWidget(QLabel("Legend:"))
        settingsLayout.addWidget(self.m_legendComboBox)
        settingsLayout.addWidget(self.m_antialiasCheckBox)
        settingsLayout.addStretch()
        baseLayout.addLayout(settingsLayout, 0, 0, 1, 3)

        # Create the charts.
        chartView = QChartView(self.createAreaChart())
        baseLayout.addWidget(chartView, 1, 0)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createBarChart(self.m_valueCount))
        baseLayout.addWidget(chartView, 1, 1)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createLineChart())
        baseLayout.addWidget(chartView, 1, 2)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createPieChart())
        # Funny things happen if the pie slice labels no not fit the screen...
        chartView.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        baseLayout.addWidget(chartView, 2, 0)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createSplineChart())
        baseLayout.addWidget(chartView, 2, 1)
        self.m_charts.append(chartView)

        chartView = QChartView(self.createScatterChart())
        baseLayout.addWidget(chartView, 2, 2)
        self.m_charts.append(chartView)

        self.setLayout(baseLayout)

        # Set the defaults.
        self.m_antialiasCheckBox.setChecked(True)
        self.updateUI()

1-2-3、数据生成函数以及信号与槽的连接

信号与槽的连接

def connectSignals(self):
   self.m_themeComboBox.currentIndexChanged.connect(self.updateUI)
   self.m_antialiasCheckBox.toggled.connect(self.updateUI)
   self.m_animatedComboBox.currentIndexChanged.connect(self.updateUI)
   self.m_legendComboBox.currentIndexChanged.connect(self.updateUI)

数据生成函数:

def generateRandomData(self, listCount, valueMax, valueCount):
    random.seed()

    dataTable = []

    for i in range(listCount):
        dataList = []
        yValue = 0.0
        f_valueCount = float(valueCount)

        for j in range(valueCount):
            yValue += random.uniform(0, valueMax) / f_valueCount
            value = QPointF(
                j + random.random() * self.m_valueMax / f_valueCount,
                yValue)
            label = "Slice " + str(i) + ":" + str(j)
            dataList.append((value, label))

        dataTable.append(dataList)

    return dataTable

总结

人与人的悲欢离合不尽相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux环境下的VScode使用教程

前言 &#xff08;1&#xff09;对于学习本文需要先有自行安装好VMware&#xff0c;对VMware有简单的了解。 &#xff08;2&#xff09;对于绝大多数使用Linux的人而言&#xff0c;经常在Windows环境下使用source insight进行编译程序&#xff0c;然后利用FileZilla将Windows的…

Ansys仿真寄生参数对信号反射的影响

1、短桩线传输线的反射 短桩线在PCB走线时会经常遇到&#xff0c;这个桩线会对信号的传输产生反射&#xff0c;那么桩线的长度和信号反射的关系可以仿真看一下&#xff0c;电路如下图所示&#xff0c;下图中&#xff0c;我们设置信号源的上升下降时间为0.8ns&#xff0c;桩线的…

Auto GPT 与 ChatGPT:有何区别?

人工智能正在迅速发展&#xff0c;即使是最熟练的人也越来越难以跟上。每隔一段时间&#xff0c;就会出现新的 AI 工具&#xff0c;在这些工具中&#xff0c;有些是时尚的&#xff0c;有些是真正有价值的。 Auto-GPT 是一种建立在 ChatGPT 技术之上的人工智能&#xff0c;很可…

leaflet根据坐标点设置多边形,生成geojson文件,计算面积值(133)

第133个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中根据坐标点设置多边形,通过.toGeoJSON() 来生成geojson文件,通过turf.area来计算面积值。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共123…

浅谈Redis7基础命令

Redis基本命令 Ping命令 心跳命令 set & get命令 set key value get key select命令 切换数据库 dbsize命令 flushdb命令 清除当前数据库数据 flushell命令 清除所有数据库数据 退出命令 quit、exit 关闭redis redis-cli shutdown shutdown 查看进程及端口号 #查看…

VirtualBox ping和xshell切换

使用virtualbox有一个奇怪的现象&#xff0c;每次连接xshell的时候ping百度&#xff0c;ping不通&#xff0c;能ping通的时候又连接不了xsell。 两种模式来回切换每次都要查要修改的东西&#xff0c;太麻烦了&#xff0c;就在这记录一下。 连接xshell 选中想要链接xshell的虚…

python3 安装 bz2包

python3 安装 bz2包 错误解决方法1、pip 安装2、重装python3&#xff08;网上推荐&#xff0c;但没尝试&#xff09;3、补全缺少文件&#xff08;博主采用&#xff09; 错误 ModuleNotFoundError: No module named _bz2 解决方法 1、pip 安装 尝试 pip3 install bz2 发现并…

一篇文章搞定《Android中的ANR》

------《ANR》 什么是ANR举个例子帮你认识ANRANR的产生原因ANR的监控手段方法一: 监控trace文件夹方法二&#xff1a;利用我们主线程的Looper方法三&#xff1a;监控SIGQUIT信号 ANR日志Traces.txtTraces文件分析几个分析案例&#xff1a;一、好定位的问题&#xff08;简单案例…

使用FastGithub解决国内访问GitHub失败的问题

问题提出 在ArduinoIDE安装开发板开发包、库时经常由于这些包和库的索引指向的是github下面的开源项目&#xff0c;所以安装失败的可能性极高。开启了FastGithub后&#xff0c;更新成功率和速度都快了很多&#xff01; 问题解决 使用FastGithub开源工具&#xff08;支持Win,Ma…

在北京,36岁的软件测试人的心路历程及学习经验,太现实了

前言 涛哥&#xff08;我认识的一位朋友&#xff0c;也是我的前辈&#xff09;出身普通&#xff0c;仅仅是一个普通二本学校毕业&#xff0c;大学也是混日子混过去的&#xff0c;年轻时没有好好学习&#xff0c;被美女、游戏吸引到迷了自我&#xff0c;他对那年毕业的记忆清晰…

jpa使用

jpa&#xff1a; java persistence api jpa只要一对多 在一对多的关系中&#xff0c;一般将 JoinColumn 放在 多端&#xff0c;, 如果不需要两边都映射对应的实体&#xff0c;&#xff0c;可以在一端设置JoinColumn ,并在多端指定一个外键属性来映射这个关系

农业病虫虚拟仿真教学平台使实验资源共享

动物直肠检查是一项常见的内窥镜检查手术&#xff0c;往往会因为实验设备、实验动物、时间、经费等方面的因素影响&#xff0c;使一些应该开设的手术教学开展较少或者无法进行&#xff0c;造成学生或从业人士对专业知识掌握以及动手实践能力的不足 因此对于新手的培训必须经过大…

MISC:HTTP 流量分析技术.

MISC&#xff1a;HTTP 流量分析技术. Misc即杂项&#xff0c;是信息隐藏又称信息伪装&#xff0c;就是通过减少载体的某种冗余&#xff0c;如空间冗余、数据冗余等&#xff0c;来隐藏敏感信息&#xff0c;达到某种特殊的目的。 信息隐藏打破了传统密码学的思维范畴&#xff0c…

短期光伏发电量短期预测(Python代码,主要模型LSTM)

1.数据集&#xff08;68779条数据&#xff09; 开始时间 DATE_TIMEPLANT_IDSOURCE_KEYDC_POWERAC_POWERDAILY_YIELDTOTAL_YIELD15-05-2020 00:0041350011BY6WEcLGh8j5v7000625955915-05-2020 00:0041350011IF53ai7Xc0U56Y000618364515-05-2020 00:0041350013PZuoBAID5Wc2HD00…

你真的会写接口自动化测试脚本?0-1精通自动化测试实战,暴涨18K...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 开头&#xff0c;…

【Linux进阶命令 01】grep(文本的全局搜索与打印)

文章目录 一、grep命令&#xff08;全局搜索与打印&#xff09;1.1 语法1.2 主要参数1.3 测试准备1.4 grep命令使用示例1.5 应用示例 一、grep命令&#xff08;全局搜索与打印&#xff09; grep &#xff08;缩写来自Globally search a Regular Expression and Print&#xff0…

一文解决eBpf在Android上的集成和调试

eBPF&#xff08;Extended Berkeley Packet Filter &#xff09;是一种新兴的linux内核功能扩展技术&#xff0c;可以无需修改内核代码&#xff0c;在保证安全的前提下&#xff0c;灵活的动态加载程序&#xff0c;实现对内核功能的扩展。 Android平台上也引入了对eBpf技术的支…

NC 人力薪酬管理薪资发放流程粗略整理

NC 人力薪酬管理薪资发放流程: 1、【公共薪资项目-集团/组织】节点新增公共新增项目 2、【薪资期间-集团/组织】节点设置薪资期间 3、根据公司实际情况,如果需要,则在【薪资标准设置-集团/组织】、【薪资规则-集团/组织】两个节点设置薪资标准和薪资规则 4、在【税率表-集…

【类和对象(下)】

文章目录 &#x1f355;前言一、&#x1f355;再谈构造函数1.1构造函数体赋值1.2初始化列表1.3explicit关键字 二、&#x1f355;static成员三、&#x1f355;友元四、&#x1f355;内部类五、&#x1f355;匿名对象六、&#x1f355;拷贝对象时编译器的一些优化七、&#x1f3…

香港Web3,已走至黎明前夜 能否抓住机遇,是外界始终关注的话题?

香港对Web3的全面开放&#xff0c;既是挑战&#xff0c;又是一个不容错过的发展机遇。香港相关行业是否有足够的基础和能力抓住金融大变局的历史性契机&#xff0c;面向未来&#xff0c;完善金融生态&#xff0c;提升香港金融中心的国际竞争力&#xff0c;是外界始终关注的话题…