PyQt5高级界面控件一

如何查看widget类及其子类有哪些属性和函数:
dir()

from PyQt5.QtWidgets import QWidget
dir(QWidget)

help()

from PyQt5.QtWidgets import QWidget
help(QWidget)

表格与树

表格与树解决的问题是如何在一个控件种有规律地呈现更多的数据。PyQt提供了两种控件类用于解决该问题,其中一种是表格结构的控件类;另外一种是树形结构的控件类。

QTableView

在通常情况下,一个应用需要和一批数据(比如数组、列表)进行交互,然后以表格的形式输出这些信息,这时就要用到QTableView类了。在QTableView中可以使用自定义的数据模型来显示内容,通过setModel来绑定数据源。

QTableVidget继承自QTableView,主要区别是QTableView可以使用自定义的数据模型来显示内容(先通过setModel来绑定数据源),而QTableWidget只能使用标准的数据模型,并且其单元格数据是通过QTableWidgetItem对象来实现的。通常使用QTableWidget就能够满足我们的要求。

QTableView控件可以绑定一个模型数据用来更新控件上的内容,可用的模式如表:
名称含义
QStringListModel存储一组字符串
QStandarItemModel存储任意层次结构的数据
QDirModel对文件系统进行封装
QSqlQueryModel对SQL的查询结果集进行封装
QSqlTableModel对SQL中的表格进行封装
QSqlRelationalTableModel对带有foreign key的SQL表格进行封装
QSortFilterProxyModel对模型中的数据进行排序或过滤
QTableView的使用
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys

class Table(QWidget):

    def __init__(self, arg=None):
        super(Table, self).__init__(arg)
        self.setWindowTitle("QTableView表格视图控件")
        self.resize(500, 300)
        self.model = QStandardItemModel(4, 4)
        self.model.setHorizontalHeaderLabels(['标题1', '标题2', '标题3', '标题4'])
        for row in range(4):
            for column in range(4):
                item = QStandardItem("row %s, column %s" % (row, column))
                self.model.setItem(row, column, item)

        self.tableView = QTableView()
        self.tableView.setModel(self.model)

        dlgLayout = QVBoxLayout()
        dlgLayout.addWidget(self.tableView)
        self.setLayout(dlgLayout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    table = Table()
    table.show()
    sys.exit(app.exec_())

表格并未填满窗口,行和列都又滚动条,可以滑动
在这里插入图片描述

QListView

QListView类用于展示数据,它的子类是QListWidget。QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据。
QListWidget是一个升级版本的QLIstView,它已经建立了要给数据库存储模型(QListWidgetItem),直接调用addItem()函数,就可以添加条目(Item)。

QListView类中的常用方法:

方法描述
setModel()用来设置View所关联的Model,可以使用Python原生的list作为数据源Model
selectedItem()选中Model中的条目
isSelected()判断Model中的某条目是否被选中

QListView类中常用信号:

信号含义
clicked当单击某项时,信号被发射
doubleClicked当双击某项时,信号被发射
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QListView, QMessageBox
from PyQt5.QtCore import QStringListModel
import sys

class ListViewDemo(QWidget):

    def __init__(self, parent=None):
        super(ListViewDemo, self).__init__(parent)
        self.setWindowTitle("QListView")
        self.resize(300, 270)
        layout = QVBoxLayout()

        listView = QListView()
        slm = QStringListModel()
        self.qList = ['Item 1', 'Item 2', 'Item 3', 'Item 4']
        slm.setStringList(self.qList)
        listView.setModel(slm)
        listView.clicked.connect(self.clicked)
        layout.addWidget(listView)
        self.setLayout(layout)

    def clicked(self, qModelIndex):
        QMessageBox.information(self, "ListWidget", "你选择了:" + self.qList[qModelIndex.row()])

if __name__ == '__main__':
    app = QApplication(sys.argv)
    table = ListViewDemo()
    table.show()
    sys.exit(app.exec_())

单击QListView控件里Model中的一项时,会弹出消息框
在这里插入图片描述

QListWidget

QListWidget类是一个基于条目的接口,用于从列表中添加或删除条目。列表中的每个条目都是一个QLIstWidgetItem对象。QListWidget可以设置多重选择。

QlistWidget类中的常用方法

方法描述
addItem()在列表中添加QListWidgetItem对象或字符串
addItems)添加列表中的每个条目
insertItem()在指定的索引处插入条目
clear()删除列表的内容
setCurrentItem()设置当前所选条目
sortTtems()按升序重新排列条目

QListWidget类中的常用信号

信号含义
currentItemChanged当列表中的条目发生改变时发射此信号
itemClicked当点击列表中的条目时发射信号

QListWidget的使用

from PyQt5.QtWidgets import *
import sys

class ListWidget(QListWidget):
    def clicked(self, item):
        QMessageBox.information(self, "ListWidget", "你选择了:" + item.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    listWidget = ListWidget()
    listWidget.resize(300, 120)
    listWidget.addItem("item 1")
    listWidget.addItem("item 2")
    listWidget.addItem("item 3")
    listWidget.addItem("item 4")
    listWidget.setWindowTitle("QListwidget")
    listWidget.itemClicked.connect(listWidget.clicked)
    listWidget.show()
    sys.exit(app.exec_())

单击QListWidget列表中的一个条目时会弹出消息框,提示选择的是哪个条目。
将QListWidget控件的itemClicked信号与自定义对象的Clicked()槽函数进行绑定
在这里插入图片描述

QTableWidget

QTableWIdget是Qt程序中常用的显示数据表格的空间,类似于C#中的DataGrid。QTableWidget是QTableView的子类,它使用标准的数据模型,并且其单元数据是通过QTableWidgetItem对象来实现。使用QTableWidget时就需要QTableWidgetItem,用来表示表格中的一个单元格,整个表格就是用单元格构建起来的。

QTableWidget类中的常用方法

方法描述
setRowCount(int row)设置QTableWidget表格控件的行数
setColumnCount(int col)设置QTableWidget表格控件的列数
setHorizontalHeaderLabels()设置QTableWidget表格控件的水平标签
setVerticalHeaderLabels()设置QTableWidget表格控件的垂直标签
setItem(int,int,QTableWidgetItem)在QTableWidget表格控件的每个选项的单元空间里添加控件
horizontalHeader()获取QTableWidget表格控件的表格头,以便执行隐藏
rowCount()获取QTableWidget表格控件的行数
columnCount()获得QTableWidget表格控件的列数
setEditTriggers(EditTriggers.triggers)设置表格是否可编辑,设置编辑规则的枚举值
setSelectionBehavior()设置表格的选择行为
setTextAlignment()设置单元格内文字的对齐方式
setSpan(int row, int column, int rowSpanCount, int columnSpanCount)合并单元格,要改变单元格的第row行第column列,要合并rowSpanCount行数和columnSpanCount列数。
setShowGrid()在默认的情况下,表格的显示是有网格线的。True:显示网格线
setColumnWidth(int column,int width)设置单元格的宽度
setRowHeight(int row,int height)设置单元格的宽度

编辑规则的枚举类型

选项描述
QAbstractItemView.NoEditTriggers0不能对表格内容进行修改
QAbstractItemView.CurrentChangedEditing1任何时候都能对单元格进行修改
QAbstractItemView.DoubleClicked2双击单元格
QAbstractItemView.SelectedClicked4单击已选中的内容
QAbstractItemView.EditKeyPressed8当修改键被按下时修改单元格
QAbstractItemView.anyKeyPressed16按任意键修改单元格
QAbstractItemView.AllEditTriggers31包括以上所有条件

表格的选择行为的枚举类型

选项描述
QAbstractItemView.SelectItem0选中单个单元格
QAbstractItemView.SelectRows1选中一行
QAbstractItemView.SelectColumns2选中一列

单元格文本的水平对齐方式

选项描述
Qt.AlignLeft将单元格的内容沿单元格的左边缘对齐
Qt.AlignRight将单元格的内容沿右边缘对齐
Qt.AlignHCenter水平居中
Qt.AlignJustify将文本在可用空间中对齐,默认从左到右

单元格文本的垂直对齐方式

选项描述
Qt.AlignTop顶部对齐
Qt.AlignBottom底部对齐
Qt.AlignVCenter垂直居中
Qt.AlignBaseline基线对齐
基本用法
from PyQt5.QtWidgets import *
import sys

class Table(QWidget):
    def __init__(self):
        super(Table, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("QTableWidget")
        self.resize(400, 300)
        conLayout = QHBoxLayout()
        tableWidget = QTableWidget()
        # 设置表格为4行3列
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(3)
        conLayout.addWidget(tableWidget)
        # 设置表头
        tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])
        newItem = QTableWidgetItem("张三")
        # 在第0行0列写入张三
        tableWidget.setItem(0, 0, newItem)
        newItem = QTableWidgetItem("男")
        tableWidget.setItem(0,1,newItem)
        self.setLayout(conLayout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Table()
    example.show()
    sys.exit(app.exec_())

在表格控件种显示的数据是可以编辑的
在这里插入图片描述

1、设置表格头

# 设置水平表头标签
tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])
# 设置垂直表头标签
tableWidget.setVerticalHeaderLabels(['行1''行2''行3''行4'])

注:生成表格,初始化行号和列号后,再设置表格的表头标签,否则没有效果

2、设置表头为伸缩模式
QTableWidget对象的horizontalHeager()函数设置表格为自适应的伸缩模式,即根据窗口大小改变网格大小

tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

3、将表格变为禁止编辑
默认情况下,表格种的字符传是可以修改的,比如双击一个单元格就可以修改原来的内容。如果要禁止这种操作,让表格对用户只是读的,则添加如下代码

tableWidget.setSelectionBehavior(QAbstractItemView.NoEditTriggers)

4、设置表格整行选中
表格默认选中的是的单个单元格,通过以下代码设置成整行选中

tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)

5、将行和列的宽度、高度设置为与所显示内容的宽度、高度相匹配

QTableWidget.resizeColumnsToContents()
QTableWidget.resizeRowsToContents()

6、表格头的显示与隐藏
对于水平方向的表头,采用以下代码进行隐藏或显示设置

tableWidget。verticalHeader().setVisible(False)

对垂直方向的表头,采用以下代码经行隐藏或显示设置

tableWidget.horizontalHeader().setVisible(False)

7、在单元格中放置控件
QTableWidget不仅允许往单元格放置文字,还允许放置控件,通过TableWidget.setItem()来添加PyQt的基本控件

comBox = QComboBox()
comBox.addItem("男")
comBox.addItem("女")
comBox.setStyleSheet("QComboBox{margin:3px};")
tableWidget.setCellWidget(0,1,comBox)

searchBtn = QPushButton("修改")
searchBtn.setDown(True)
searchBtn.setStyleSheet("QPushButton{margin:3px};")
tableWidget.setCellWidget(0,2,searchBtn)

在这里插入图片描述
8、在表格中快速定位到指定行
当tableWidget表格的行数很多时,可以通过输入行号进行直接定位并显示,比如输入10,直接显示第10行

# 遍历表格查找对应的单元格
item = self.tableWidge.findItems(text,QtCore,Qt.MatchExactly)

# 获取行号
row = item[0].row()

# 模拟鼠标滚轮快速定位到指定行
self.tableWidget.verticalScrollBar().setSliderPosition(row)
from PyQt5.QtWidgets import *
import sys
from PyQt5 import QtCore
from PyQt5.QtGui import QColor, QBrush

class Table(QWidget):
    def __init__(self):
        super(Table, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("QTableWidget")
        self.resize(600, 800)
        conLayout = QHBoxLayout()
        tableWidget = QTableWidget()
        tableWidget.setRowCount(30)
        tableWidget.setColumnCount(4)
        conLayout.addWidget(tableWidget)

        for i in range(30):
            for j in range(4):
                itemContent = '(%d,%d)' % (i, j)
                tableWidget.setItem(i,j,QTableWidgetItem(itemContent))

        self.setLayout(conLayout)

        # 遍历表格查找对应项
        text = "(10,1)"
        items = tableWidget.findItems(text, QtCore.Qt.MatchExactly)
        item = items[0]

        # 选中单元格
        # item.setSelected(True)
        # 设置单元格的背景色为红色
        item.setForeground(QBrush(QColor(255,0,0)))

        row = item.row()

        # 通过鼠标滚轮定位,快速定位到第11行
        tableWidget.verticalScrollBar().setSliderPosition(row)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Table()
    example.show()
    sys.exit(app.exec_())

窗口表格会直接显示指定的行,且背景色修改为红色
在这里插入图片描述

设置单元格

1、设置单元格文本颜色
将表格第一行中三个单元格的文本颜色设置为红色

newItem = QTableWidgetItem("张三")
newItem.setForeground(QBrush(QColor(255,0,0)))
tableWidget.setItem(0,0,newItem)

newItem = QTableWidgetItem("男")
newItem.setForeground(QBrush(QColor(255,0,0)))
tableWidget.setItem(0,1,newItem)

newItem = QTableWidgetItem("160")
newItem.setForeground(QBrush(QColor(255,0,0)))
tableWidget.setItem(02,newItem)

2、将字体加粗

newItem = QTableWidgetItem("张三")
newItem.setFont(QFont("Times", 12, QFont.Black))
tableWidget.setItem(0,0,newItem)

3、设置单元格的排序方式
使用Qt.DescendingOrder表示在单元格内降序排列,Qt.AscendingOrder表示在单元格内升序排列

tableWidget.sortItems(2,QtCore.Qt.DescendingOrder)

4、设置单元格文本的对齐方式
使用QTableWidgetItem.setTextAlignment(int)函数设置单元格文本的对齐方式,该函数的参数为对齐方式。

演示第一行第一列的单元格内容右对齐并与底部对齐

tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])
newItem = QTableWidgetItem("张三")

newItem.setTextAlignment(Qt.AlignRight | Qt.AlignBottom)
tableWidget.setItem(0, 0, newItem)

5、合并单元格效果的实现
将表格中第一行第一列的单元格,更改为占据3行1列,核心代码如下

tableWidget.setSpan(0,0,3,1)

6、设置单元格的大小

将第一列的单元格宽度设置为150,第一行的单元格高度设置为120

# 将第一列的单元格宽度设置为150
tableWidget.setColumnWidth(0, 150)
# 第一行的单元格高度设置为120
tableWidget.setRowHeight(0,120)

7、在表格中不显示分割线
QTableWidget类的setShowGrid()函数是从QTableView类继承的,用来设置是否显示表格的分割线,默认显示分割线。使用以下代码,不显示分割线。

tableWidget.setShowGrid(False)

在很多情况下,应用程序中的表格只需要显示水平表头,而不需要显示垂直表头,可以使用如下代码

tableWidget.verticalHeader().setVisible(False)

在这里插入图片描述
8、为单元格添加图片
可以在单元格内添加图片,并显示图片的信息描述,核心代码如下

newItem = QTableWidgetItem(QIcon("./images/beibao.png","背包"))
tableWidget.setItem(0,3,newItem)

9、改变单元格中显示图片大小
使用QTableWidget默认处理QTableWidgetItem对象,在每个单元格中放置图片,核心代码如下

conLayout =QHBoxLayout()

table = QTableWIdget()
table.setColumnCount(3)
table.setRowCount(5)

table.setHorizontalHeaderLabels(['图片1''图片2''图片3'])
table.setEditTriggers(QAbstractItemView.NoEditTriggers)
table.setIconSize(QSize(300,200))

for i in range(3):
	table.setColumnWidth(i,300)
for i in range(5):
	table.setRowHeight(i,200)

for k in range(15):
	i = k/3
	j = k%3
	item = QTableWidgetItem()
	# 用户点击表格时,图片被选中
	item.setFlags(Qt.ItemIsEnabled)
	icon = QIcon(r'.\images\bao%d.png' %k)
	item.setIcon(QIcon(icon))
	print('e/icons/%d.png i=%d j=%d' % (k,i,j))
	table.setItem(i,j,item)
conLayout.addWidget(table)
self.setLayout(conLayout)

10、获取单元格内容
通过实现itemClicked(QTableWidgetItem*)信号的槽函数,可以获得所点击的单元格的引用,进而获得其中的内容。
以下代码将itemClicked信号与getItem()函数进行绑定

tableWidget.itemClicked.connect(self.handleItemClick)
def getItem(self.item):
	print("you selected =>" + item.text())
支持右键菜单
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal, QObject, Qt, pyqtSlot
import sys

class Table(QWidget):
    def __init__(self):
        super(Table, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("QTableWidget")
        self.resize(500, 300)
        conLayout = QHBoxLayout()
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(5)
        self.tableWidget.setColumnCount(3)
        conLayout.addWidget(self.tableWidget)

        self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重'])
        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        # 第一行内容
        newItem = QTableWidgetItem("张三")
        self.tableWidget.setItem(0, 0, newItem)

        newItem = QTableWidgetItem("男")
        self.tableWidget.setItem(0, 1, newItem)

        newItem = QTableWidgetItem("160")
        self.tableWidget.setItem(0, 2, newItem)
        # 第二行内容
        newItem = QTableWidgetItem("李四")
        self.tableWidget.setItem(1, 0, newItem)

        newItem = QTableWidgetItem("女")
        self.tableWidget.setItem(1, 1, newItem)

        newItem = QTableWidgetItem("170")
        self.tableWidget.setItem(1, 2, newItem)

        # 运行右键产生菜单
        self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)
        # 将右键菜单绑定到槽函数generateMenu
        self.tableWidget.customContextMenuRequested.connect(self.generateMenu)
        self.setLayout(conLayout)

    def generateMenu(self, pos):
        row_num = -1
        for i in self.tableWidget.selectionModel().selection().indexes():
            row_num = i.row()

        if row_num < 2:
            menu = QMenu()
            item1 = menu.addAction(u"选项一")
            item2 = menu.addAction(u"选项二")
            item3 = menu.addAction(u"选项三")
            action = menu.exec_(self.tableWidget.mapToGlobal(pos))
            if action == item1:
                print('true')
                print("你选择选项一,当前文字内容是:", self.tableWidget.item(row_num, 0).text(),
                      self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())

            elif action == item2:
                print("你选择选项一,当前文字内容是:", self.tableWidget.item(row_num, 0).text(),
                      self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())
            elif action == item3:
                print("你选择选项一,当前文字内容是:", self.tableWidget.item(row_num, 0).text(),
                      self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())
            else:
                return

if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Table()
    example.show()
    sys.exit(app.exec_())

选中单元格后,单击鼠标右键,从弹出的快捷菜单中选择选项。

如果单击张三行,选择选项一,后台输出为:

你选择选项一,当前文字内容是: 张三 男 160

如果单击李四行,选选项一,后台输出为:

你选择选项一,当前文字内容是: 李四 女 170

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初识git · 有关模型

目录 前言&#xff1a; 有关开发模型 前言&#xff1a; 其实文章更新到这里的时候&#xff0c;我们已经学习了可以满足我们日常生活中的基本需求的指令了&#xff0c;但是为什么要更新本篇文章呢&#xff1f;是因为实际生活中我们对于开发工作&#xff0c;运维工作&#xff…

RISC-V笔记——显式同步

1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Explicit Synchronization(显示同步)。 2. 显示同步 显示同步指的是&#xff1a…

网络空间指纹:新型网络犯罪研判的关键路径

前言 新型网络犯罪是指利用计算机技术和互联网平台进行犯罪活动的一类犯罪行为。它涵盖了一系列使用网络和数字技术进行非法活动的行为&#xff0c;如网络钓鱼、网络诈骗、恶意软件攻击、黑客入侵、数据泄露、网络色情和社交网络犯罪等。 随着当前打击治理新型网络犯罪博弈态…

idea中,git提交时忽略某些本地修改.将文件从git暂存区移除

我们有时候在本地调试代码时&#xff0c;某些配置文件需要修改成本地环境中。当改完后&#xff0c;需要提交代码时&#xff0c;这些文件又不能推到git上。如下图&#xff1a; 当出现这种情况&#xff0c;我们每次都需要手动去将不需要提交的文件的对号去掉。文件多了后&#x…

dlib库-人脸检测

文章目录 一、介绍二、与OpenCv对比三、dlib库安装1.直接安装2.dlib库whl文件进行安装 四、代码实现五、总结 一、介绍 dlib库是一个适用于C和Python的第三方库。包含机器学习、计算机视觉和图像处理的工具包&#xff0c;被广泛的应用于机器人、嵌入式设备、移动电话和大型高性…

STM32L031F6P6基于CubeMX的串口通信调试笔记

用CubeMX创建项目 本实例用的PA14、PA13两个引脚&#xff0c;LPUART1。 对串口参数进行设置&#xff1a; 开启串口中断&#xff1a; 时钟源设置成内部高频时钟&#xff1a; 对项目进行设置&#xff1a; 生成代码&#xff1a; 在串口初始化函数中加入 __HAL_UART_ENA…

wps图标没有坐标轴标题怎么办?wps表格不能用enter下怎么办?

目录 wps图标没有坐标轴标题怎么办 一、在WPS PPT中添加坐标轴标题 二、在WPS Excel中添加坐标轴标题 wps表格不能用enter下怎么办 一、检查并修改设置 二、检查单元格保护状态 三、使用快捷键实现换行 wps图标没有坐标轴标题怎么办 一、在WPS PPT中添加坐标轴标题 插入…

基于Java微信小程序的高校教务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

Django学习-后台管理相关操作

admin配置步骤&#xff1a; 注册自定义的模型类&#xff1a; 代码&#xff1a; from django.contrib import admin from .models import Book, Author# Register your models here. admin.site.register(Book) admin.site.register(Author)模型管理器类&#xff08;修改&#…

工程技术-中英文普刊合集

文章目录 一、征稿简介二、重要信息三、服务简述四、投稿须知五、联系咨询 一、征稿简介 二、重要信息 期刊官网&#xff1a;https://ais.cn/u/3eEJNv 三、服务简述 四、投稿须知 1.在线投稿&#xff1a;由艾思科蓝支持在线投稿&#xff0c;请将文章全文投稿至艾思科蓝投稿系…

案例分析:Modbus设备如何通过MQTT网关连接阿里云IoT

物联网技术的发展&#xff0c;越来越多的传统工业控制系统需要与现代云平台集成&#xff0c;以便实现远程监控、数据分析等功能。Modbus协议作为工业控制领域的一种常见通讯协议&#xff0c;其设备通常需要转换为MQTT协议才能更好地与诸如阿里云IoT、华为云IoT、ThingsBoard等云…

pdf文件太大如何变小?

pdf文件太大如何变小&#xff1f;在处理PDF文件的过程中&#xff0c;文件大小往往成为了一个不可忽视的关键因素。庞大的文件不仅占据了宝贵的存储空间&#xff0c;还在文件传输过程中造成了时间上的延误&#xff0c;这无疑给工作效率带来了不小的挑战。特别是在电子邮件附件的…

突破干扰,无人机自动驾驶技术详解

突破干扰的无人机自动驾驶技术&#xff0c;是一个结合了多学科领域的复杂系统&#xff0c;旨在确保无人机在复杂电磁环境、人为干扰等条件下仍能自主、安全地完成飞行任务。以下是对该技术的详细解析&#xff1a; 一、技术概述 无人机自动驾驶技术通过集成传感器技术、人工智…

Axure基本元件库——基本元件、表单和菜单表格

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;认识和数据Axure基本元件库 主要内容&#xff1a;基本元件、表单元件和菜单表格 应用场景&#xff1a;原型绘制基本元件、页面组成和交互基础 正文…

网络爬虫中的几种数据存储方式(上篇)

本文的内容是介绍网络爬虫中的数据存储方式。大家都知道爬虫的最重要功能就是从网络中将数据提取出来。现在问题来了&#xff0c;那么提取出来的数据该何去何从&#xff0c;如果仅仅只是保存在内存当中&#xff0c;当程序结束后岂不是所有的内容都消失了&#xff1f;因此需要将…

大语言模型赋能病理AI,自动从报告文本中分类TNM分期|顶刊精析·24-10-17

小罗碎碎念 这篇文章介绍了一种名为BB-TEN&#xff08;Big Bird – TNM staging Extracted from Notes&#xff09;的方法&#xff0c;它能够自动从病理报告文本中分类TNM&#xff08;肿瘤大小、区域淋巴结受累和远处转移&#xff09;分期。 今天分享的这篇文章于2024-10-16发表…

elementUi el-table 表头高度异常问题

1、现象 在同一个页面通过状态切换不同table时&#xff0c;当从有合并标头行的table切换到无合并表头的table时&#xff0c;无合并表头的table的表头的高度异常了&#xff0c;如下图 切换后 2、解决 给每个el-table 加上一个唯一的key <el-table key"1"></…

大规模语言模型与生成模型:技术原理、架构与应用

大规模语言模型与生成模型&#xff1a;技术原理、架构与应用 个人主页&#xff1a;chian-ocean文章专栏 大规模语言模型与生成模型&#xff1a;技术原理、架构与应用1. 引言2. 大规模语言模型概述2.1 什么是大规模语言模型&#xff1f;2.2 常见的语言模型架构2.3 语言模型的技术…

在ESP-IDF环境中如何进行多文件中的数据流转-FreeRTOS实时操作系统_流缓存区“xMessageBuffer”

一、建立三个源文件和对应的头文件 建立文件名&#xff0c;如图所示 图 1-1 二、包含相应的头文件 main.h 图 2-1 mess_send.h mess_rece.h和这个中类似,不明白的大家看我最后面的源码分享 图2-2 三、声明消息缓存区的句柄 大家注意&#xff0c;在main.c中定义的是全局变…

Java 类和对象详解(上 )

个人主页&#xff1a; 鲤鱼王打挺-CSDN博客 Java专栏&#xff1a;https://blog.csdn.net/2401_83779763/category_12801101.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12801101&sharereferPC&sharesource2401_83779763&sharefromfrom_link &…