当前位置: 首页 > news >正文

Qt开发:QComboBox的使用

文章目录

    • 一、概述
    • 二、QComboBox添加数据
    • 三、常用函数
    • 四、信号与槽函数

一、概述

QComboBox 是 Qt 提供的一个下拉列表控件,它允许用户从预定义的选项中进行选择,同时也支持手动输入自定义内容(如果启用了可编辑模式)。QComboBox 继承自 QWidget,并提供了丰富的 API 用于管理选项、响应用户交互等。

二、QComboBox添加数据

void addItem(const QString &text, const QVariant &userData = QVariant())
void addItem(const QIcon &icon, const QString &text, const QVariant &userData = QVariant())
void addItems(const QStringList &texts)

在 Qt 中,QComboBox 提供了 addItem 和 addItems 三个重载函数,用于向下拉列表中添加选项。
这些函数支持:

  • 仅添加文本选项。
  • 添加带有 QIcon 图标的选项。
  • 批量添加多个文本选项。

1.addItem(const QString &text, const QVariant &userData = QVariant())
该函数向 QComboBox 中添加一个选项,文本内容由 text 指定,同时可以绑定一个额外的 QVariant 数据(可选)。

#include <QComboBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox();comboBox->addItem("苹果", 100);   // 绑定整数数据comboBox->addItem("香蕉", "yellow"); // 绑定字符串数据comboBox->addItem("橙子");        // 仅添加文本,不绑定数据// 获取选中项的文本和数据QString selectedText = comboBox->currentText();QVariant selectedData = comboBox->currentData();qDebug() << "选中的文本:" << selectedText;qDebug() << "选中的数据:" << selectedData.toInt();
}

输出结果:
在这里插入图片描述
2. addItem(const QIcon &icon, const QString &text, const QVariant &userData = QVariant())
该函数不仅可以添加文本,还可以为选项设置一个 QIcon 图标,同时支持绑定 QVariant 数据(可选)。

QComboBox *comboBox = new QComboBox();
comboBox->addItem(QIcon(":/icons/apple.png"), "苹果", 100);
comboBox->addItem(QIcon(":/icons/banana.png"), "香蕉", "yellow");
comboBox->addItem(QIcon(":/icons/orange.png"), "橙子");qDebug() << "当前选中的文本:" << comboBox->currentText();
qDebug() << "当前选中的数据:" << comboBox->currentData().toInt();

3. addItems(const QStringList &texts)
该函数用于批量添加多个文本选项。

QStringList fruits = {"苹果", "香蕉", "橙子", "葡萄"};
comboBox->addItems(fruits);
void insertItem(int index, const QString &text, const QVariant &userData = QVariant())
void insertItem(int index, const QIcon &icon, const QString &text, const QVariant &userData = QVariant())
void insertItems(int index, const QStringList &list)

1. void insertItem(int index, const QString &text, const QVariant &userData = QVariant())
作用: 在指定 index 位置插入一个文本项,并可选地附加 userData(用户自定义数据)。
参数:

  • index:插入位置的索引(如果 index 超出范围,则插入到末尾)。
  • text:插入项的显示文本。
  • userData(可选):存储附加数据(如 ID、数据库键值等)。
QComboBox comboBox;
comboBox.addItem("Apple");
comboBox.addItem("Banana");// 在索引 1 处插入 "Cherry",并附加 ID 303
comboBox.insertItem(1, "Cherry", 303);// 结果:
// Index 0 -> "Apple"
// Index 1 -> "Cherry"
// Index 2 -> "Banana"

2. void insertItem(int index, const QIcon &icon, const QString &text, const QVariant &userData = QVariant())
作用: 在指定 index 位置插入一个带图标的文本项,并可选地附加 userData(用户自定义数据)。

参数:

  • index:插入位置的索引(如果超出范围,则插入到末尾)。
  • icon:图标(QIcon)。
  • text:插入项的显示文本。
  • userData(可选):存储附加数据。
QComboBox comboBox;
QIcon appleIcon(":/icons/apple.png");
QIcon bananaIcon(":/icons/banana.png");comboBox.insertItem(0, appleIcon, "Apple", 101);
comboBox.insertItem(1, bananaIcon, "Banana", 202);// 结果:
// Index 0 -> "Apple" (带 appleIcon)
// Index 1 -> "Banana"(带 bananaIcon)

3. void insertItems(int index, const QStringList &list)
作用: 在指定 index 位置批量插入多个文本项。

参数:

  • index:插入位置的索引(如果 index 超出范围,则插入到末尾)。
  • list:要插入的文本项列表(QStringList)。
QComboBox comboBox;
comboBox.addItem("Apple");// 在索引 1 处批量插入多个选项
QStringList fruits = {"Banana", "Cherry", "Grapes"};
comboBox.insertItems(1, fruits);// 结果:
// Index 0 -> "Apple"
// Index 1 -> "Banana"
// Index 2 -> "Cherry"
// Index 3 -> "Grapes"
void setItemData(int index, const QVariant &value, int role = Qt::UserRole)
void setItemIcon(int index, const QIcon &icon)
void setItemText(int index, const QString &text)
void setLineEdit(QLineEdit *edit)

1. void setItemData(int index, const QVariant &value, int role = Qt::UserRole)
作用:设置 QComboBox 指定索引 (index) 处的 附加数据,存储在 role 指定的角色中。

参数:

  • index:要修改的项的索引(从 0 开始)。
  • value:要存储的数据,类型为 QVariant。
  • role(默认值 Qt::UserRole):数据的类型,可以是 Qt::ItemDataRole 枚举值,例如:Qt::UserRole(默认,用户自定义数据)、Qt::DecorationRole(存储图标)、Qt::ToolTipRole(存储鼠标悬停时的提示文本)。
 QComboBox *comboBox = new QComboBox(this);comboBox->addItem("Apple");comboBox->setItemData(0, 101, Qt::UserRole); // 为第 0 项存储一个 IDcomboBox->setItemData(0, "This is an apple", Qt::ToolTipRole); // 设置鼠标提示// 存储图标//QPixmap iconPixmap(":/icons/sample.png");//comboBox->setItemData(0, iconPixmap, Qt::DecorationRole);//QVariant iconData = comboBox->itemData(0, Qt::DecorationRole);

2.void setItemIcon(int index, const QIcon &icon)
作用:为 QComboBox 指定索引 (index) 处的项 设置图标。

参数:

  • index:要修改的项的索引。
  • icon:要设置的 QIcon。
QComboBox *comboBox = new QComboBox(this);
comboBox->addItem("Folder");
comboBox->setItemIcon(0, QIcon(":/icons/folder.png")); // 为第 0 项设置图标

3. void setItemText(int index, const QString &text)
作用:修改 QComboBox 指定索引 (index) 处的项的 文本。

参数:

  • index:要修改的项的索引。
  • text:新的文本。
QComboBox *comboBox = new QComboBox(this);
comboBox->addItem("Old Name");
comboBox->setItemText(0, "New Name"); // 修改第 0 项的文本

*4. void setLineEdit(QLineEdit edit)
作用:设置 QComboBox 内部的 QLineEdit,用于 自定义输入框(当 QComboBox::setEditable(true) 时生效)。

参数:
edit:QLineEdit 对象的指针。

QLineEdit *customEdit = new QLineEdit();
customEdit->setPlaceholderText("Enter item...");
customEdit->setStyleSheet("color: blue; font-weight: bold;");QComboBox *comboBox = new QComboBox(this);
comboBox->setEditable(true);
comboBox->setLineEdit(customEdit); // 替换默认输入框

三、常用函数

1. QCompleter completer() const
功能:获取 QComboBox 当前使用的 QCompleter(如果有)。QCompleter 用于提供自动补全功能。

#include <QComboBox>
#include <QCompleter>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);comboBox->setGeometry(100, 100, 250, 40);QStringList words = {"苹果", "香蕉", "橙子", "草莓", "葡萄"};QCompleter *completer = new QCompleter(words);comboBox->setCompleter(completer);comboBox->setEditable(true);comboBox->addItems(words);
}

在这里插入图片描述

2. int count() const
功能:返回 QComboBox 中选项的总数。

#include <QComboBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);QStringList words = {"苹果", "香蕉", "橙子", "草莓", "葡萄"};comboBox->addItems(words);qDebug() << "QComboBox 选项总数:" << comboBox->count();
}

在这里插入图片描述
3. QVariant currentData(int role = Qt::UserRole) const
功能:获取当前选中项的 QVariant 绑定数据,默认为 Qt::UserRole。

comboBox->addItem("苹果", 100);
comboBox->addItem("香蕉", 200);QVariant data = comboBox->currentData();
qDebug() << "当前选项的数据:" << data.toInt();

4. int currentIndex() const
功能:获取 QComboBox 当前选中项的索引。

qDebug() << "当前选中项索引:" << comboBox->currentIndex();

5. QString currentText() const
功能:获取 QComboBox 当前选中项的文本内容。

qDebug() << "当前选中项文本:" << comboBox->currentText();

6.bool duplicatesEnabled() const
功能:检查当前 QComboBox 是否允许重复的条目(item)。

返回值:

  • true:允许重复项,即 QComboBox 可以包含多个相同的条目。
  • false:不允许重复项,添加相同的条目时不会插入。

默认值: false(即默认不允许重复项)。
相关函数:void setDuplicatesEnabled(bool enable): 设置是否允许重复条目。

#include <QComboBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);// 默认不允许重复项qDebug() << "Before setting: " << comboBox->duplicatesEnabled(); // false// 允许重复项comboBox->setDuplicatesEnabled(true);qDebug() << "After setting: " << comboBox->duplicatesEnabled(); // true// 添加条目comboBox->addItem("Apple");comboBox->addItem("Banana");comboBox->addItem("Apple"); // 允许重复,成功添加
}

8.int findData(const QVariant &data, int role = Qt::UserRole, Qt::MatchFlags flags = Qt::MatchExactly) const
功能:在 QComboBox 的 item 数据中查找匹配的项,并返回其索引(index)。如果找不到匹配项,则返回 -1。

参数说明:
data(const QVariant &):要查找的数据值,它可以是 QString、int、QVariant 等类型。
role(int,默认 Qt::UserRole):

  • 指定查找的 数据角色(Data Role)。
  • 默认值是 Qt::UserRole,表示匹配的是 setItemData(index, value, Qt::UserRole) 存储的数据。Qt::DisplayRole:匹配 文本(text)(即 addItem(text) 的值)。
  • flags(Qt::MatchFlags,默认 Qt::MatchExactly)指定 匹配模式:Qt::MatchExactly(默认):完全匹配。Qt::MatchContains:包含匹配(部分匹配)。Qt::MatchStartsWith:前缀匹配。Qt::MatchEndsWith:后缀匹配。

返回值:

  • 找到匹配项时,返回该项的索引(index)。
  • 未找到匹配项时,返回 -1。

** 按文本查找(默认 Qt::DisplayRole)**

#include <QComboBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);// 添加选项comboBox->addItem("Apple");comboBox->addItem("Banana");comboBox->addItem("Cherry");// 查找文本 "Banana"int index = comboBox->findData("Banana", Qt::DisplayRole);qDebug() << "Index of 'Banana':" << index;  // 输出 1(索引从0开始)// 查找不存在的文本int notFound = comboBox->findData("Orange", Qt::DisplayRole);qDebug() << "Index of 'Orange':" << notFound;  // 输出 -1(未找到)
}

按 Qt::UserRole 自定义数据查找

#include <QComboBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);// 添加选项,并给每个项存储一个 ID 作为 UserRole 数据comboBox->addItem("Apple", 101);   // UserRole = 101comboBox->addItem("Banana", 202);  // UserRole = 202comboBox->addItem("Cherry", 303);  // UserRole = 303// 查找 UserRole = 202 对应的索引int index = comboBox->findData(202, Qt::UserRole);qDebug() << "Index of item with UserRole 202:" << index;  // 输出 1// 查找不存在的 UserRole 数据int notFound = comboBox->findData(999, Qt::UserRole);qDebug() << "Index of item with UserRole 999:" << notFound;  // 输出 -1
}

使用 Qt::MatchContains 进行模糊查找

#include <QComboBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);/// 添加选项comboBox->addItem("Apple");comboBox->addItem("Green Apple");comboBox->addItem("Banana");// 使用部分匹配(包含 "Apple")int index = comboBox->findData("Apple", Qt::DisplayRole, Qt::MatchContains);qDebug() << "First match for 'Apple' (MatchContains):" << index;  // 可能返回 0 或 1
}

9.int findText(const QString &text, Qt::MatchFlags flags = …) const
功能:在 QComboBox 的选项文本(text)中查找匹配项,并返回其索引(index)。如果找不到匹配项,则返回 -1。

参数说明:
text(const QString &):要查找的字符串(即 QComboBox 选项的显示文本)。
flags(Qt::MatchFlags,默认 Qt::MatchExactly)指定查找模式:

  • Qt::MatchExactly(默认):完全匹配。
  • Qt::MatchContains:包含匹配(部分匹配)。
  • Qt::MatchStartsWith:前缀匹配(以 text 开头)。
  • Qt::MatchEndsWith:后缀匹配(以 text 结尾)。
  • Qt::MatchCaseSensitive:区分大小写匹配(可与其他匹配模式组合使用)。

返回值:

  • 找到匹配项时,返回该项的索引(index)。
  • 未找到匹配项时,返回 -1。

精确匹配(默认 Qt::MatchExactly)

#include <QComboBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);// 添加选项comboBox->addItem("Apple");comboBox->addItem("Banana");comboBox->addItem("Cherry");// 精确查找 "Banana"int index = comboBox->findText("Banana");qDebug() << "Index of 'Banana':" << index;  // 输出 1// 查找不存在的文本int notFound = comboBox->findText("Orange");qDebug() << "Index of 'Orange':" << notFound;  // 输出 -1
}

使用 Qt::MatchContains 进行模糊查找

#include <QComboBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);// 添加选项comboBox->addItem("Apple");comboBox->addItem("Banana");comboBox->addItem("Cherry");// 使用部分匹配(包含 "Apple")int index = comboBox->findText("App", Qt::MatchContains);qDebug() << "First match for 'Apple' (MatchContains):" << index;  // 可能返回 0 或 1
}

前缀匹配(Qt::MatchStartsWith)

int index = comboBox.findText("Gre", Qt::MatchStartsWith);
qDebug() << "Index of first item starting with 'Gre':" << index;  // 可能返回 1

后缀匹配(Qt::MatchEndsWith)

int index = comboBox.findText("ana", Qt::MatchEndsWith);
qDebug() << "Index of first item ending with 'ana':" << index;  // 可能返回 2(Banana)

区分大小写匹配(Qt::MatchCaseSensitive)

int index = comboBox.findText("apple", Qt::MatchExactly | Qt::MatchCaseSensitive);
qDebug() << "Index of case-sensitive 'apple':" << index;  // -1,因为 "Apple" 是大写

10.QVariant itemData(int index, int role = Qt::UserRole) const
功能:该函数返回 QVariant,表示 QComboBox 中某个索引项的特定角色 (role) 对应的数据。

参数说明:
index:要查询的项目索引(从 0 开始)。
role(默认值 Qt::UserRole):要获取的数据的角色,常见角色包括:

  • Qt::DisplayRole(默认显示文本)
  • Qt::UserRole(用户自定义数据)
  • Qt::DecorationRole(图标)
  • 其他 Qt::ItemDataRole 枚举值

返回值:

  • 返回存储在 index 处 role 角色的数据,以 QVariant 形式存储。
  • 如果索引无效,则返回 空的 QVariant。
#include <QComboBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);// 添加选项,并存储额外的 ID 数据comboBox->addItem("Apple", 101);comboBox->addItem("Banana", 102);comboBox->addItem("Cherry", 103);// 获取第二项的 UserRole 数据QVariant data = comboBox->itemData(1, Qt::UserRole);qDebug() << "Item data at index 1 (Banana):" << data.toInt();// 获取第二项的 DisplayRole 数据QVariant display = comboBox->itemData(1, Qt::DisplayRole);qDebug() << "Item data at index 1 (Banana):" << display.toString();
}

在这里插入图片描述
11. QIcon itemIcon(int index) const
功能:获取 QComboBox 指定索引 (index) 处的项的图标。

参数:
index:要获取图标的项的索引(从 0 开始)。

返回值:返回 QIcon,即 index 处项的图标。

#include <QComboBox>
#include <QDebug>
#include <QLineEdit>MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{QComboBox *comboBox = new QComboBox(this);comboBox->addItem(QIcon(":/icons/apple.png"), "Apple");comboBox->addItem(QIcon(":/icons/banana.png"), "Banana");// 获取第 1 项的图标QIcon icon = comboBox->itemIcon(1);if (!icon.isNull()) {qDebug() << "Banana has an icon.";} else {qDebug() << "Banana has no icon.";}
}

12. QString itemText(int index) const
功能:获取 QComboBox 指定索引 (index) 处的项的文本。

参数:
index:要获取文本的项的索引。

返回值:

  • 返回 QString,即 index 处的项的文本。
  • 如果索引无效,则返回空字符串 “”。
QComboBox *comboBox = new QComboBox(this);
comboBox->addItem("Apple");
comboBox->addItem("Banana");// 获取第 1 项的文本
QString text = comboBox->itemText(1);
qDebug() << "Item at index 1:" << text; // 输出 "Banana"

*13. QLineEdit lineEdit() const
功能:获取 QComboBox 内部的 QLineEdit 对象(仅当 QComboBox 设为可编辑模式时 setEditable(true) 生效)。

返回值:

  • 返回 QLineEdit*,即 QComboBox 关联的输入框指针。
  • 如果 QComboBox 不可编辑,则返回 nullptr。
QComboBox *comboBox = new QComboBox(this);
comboBox->setEditable(true);// 获取 QLineEdit 并设置占位符
QLineEdit *edit = comboBox->lineEdit();
if (edit) {edit->setPlaceholderText("Enter an item...");edit->setStyleSheet("color: blue;");
}

四、信号与槽函数

槽函数:

void clear()
void clearEditText()
void setCurrentIndex(int index)
void setCurrentText(const QString &text)
void setEditText(const QString &text)

1. void clear()
作用:

  • 清空 QComboBox 的所有项,但不会影响 QLineEdit 的输入(如果 setEditable(true))。
  • 通常用于动态刷新数据。
QComboBox *comboBox = new QComboBox(this);
comboBox->addItem("Apple");
comboBox->addItem("Banana");// 清空所有项
comboBox->clear();

2. void clearEditText()
作用:

  • 清空 QComboBox 编辑框的文本,但不会影响列表项(只适用于 setEditable(true))。
  • 适用于输入框需要清空但保留选项的情况。
QComboBox *comboBox = new QComboBox(this);
comboBox->addItem("Apple");
comboBox->addItem("Banana");comboBox->setEditable(true);
comboBox->setEditText("Type something...");// 清空编辑框文本
comboBox->clearEditText();

3. void setCurrentIndex(int index)
作用:

  • 设置 QComboBox 当前选中的项,index 从 0 开始。
  • 如果 index 超出范围,则不做任何操作。
QComboBox *comboBox = new QComboBox(this);
comboBox->addItem("Apple");
comboBox->addItem("Banana");// 让 "Banana" 变为当前选中项(索引 1)
comboBox->setCurrentIndex(1);

4. void setCurrentText(const QString &text)
作用:

  • 设置 QComboBox 当前选中的项,匹配 text。
  • 如果 text 已经存在于下拉列表,则选中它。
  • 如果 text 不存在:如果 setEditable(true),则将 text 作为新输入内容。如果 setEditable(false),则什么都不会发生。
QComboBox *comboBox = new QComboBox(this);
comboBox->addItem("Apple");
comboBox->addItem("Banana");// 选中 "Banana"
comboBox->setCurrentText("Banana");// 试图选中 "Orange"(如果 `setEditable(false)`,此操作无效)
comboBox->setCurrentText("Orange");

5. void setEditText(const QString &text)
作用:

  • 直接设置 QComboBox 编辑框的文本(不会影响选中项)。
  • 只在 setEditable(true) 时生效。
QComboBox *comboBox = new QComboBox(this);
comboBox->setEditable(true);
comboBox->addItem("Apple");
comboBox->addItem("Banana");// 设置编辑框文本(不会影响选中项)
comboBox->setEditText("Hello");

信号列表:

void activated(int index)
void currentIndexChanged(const QString &text)
void currentIndexChanged(int index)
void currentTextChanged(const QString &text)
void editTextChanged(const QString &text)
void highlighted(int index)
void textActivated(const QString &text)
void textHighlighted(const QString &text)

在这里插入图片描述
1. activated(int index):用户选择项时触发
适用于用户点击项或按 Enter 触发操作,但 不会在代码更改 setCurrentIndex() 时触发。

connect(comboBox, QOverload<int>::of(&QComboBox::activated), this, [](int index) {qDebug() << "Activated item index:" << index;});

2. currentIndexChanged(int index) & currentIndexChanged(QString text)
适用于 监听用户选择或代码变更选项,可以通过 索引 或 文本 监听。

connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [](int index) {qDebug() << "Index changed to:" << index;});connect(comboBox, QOverload<const QString &>::of(&QComboBox::currentIndexChanged), this, [](const QString &text) {qDebug() << "Text changed to:" << text;});

3. currentTextChanged(const QString &text):文本内容变更
适用于监听当前文本变化(包括编辑输入和选择项改变)。

connect(comboBox, &QComboBox::currentTextChanged, this, [](const QString &text) {qDebug() << "Current text changed to:" << text;});

4. editTextChanged(const QString &text):编辑框内容变更
适用于 监听 QComboBox 编辑框实时输入(仅 setEditable(true) 时有效)。

comboBox->setEditable(true); // 启用可编辑模式connect(comboBox, &QComboBox::editTextChanged, this, [](const QString &text) {qDebug() << "User typing:" << text;});

5. highlighted(int index):鼠标悬停高亮
适用于 鼠标悬停时触发(不需要点击),可用于 显示工具提示、预览详情。

connect(comboBox, QOverload<int>::of(&QComboBox::highlighted), this, [](int index) {qDebug() << "Hovered over item index:" << index;});

6. textActivated(const QString &text) & textHighlighted(const QString &text)
和 activated()、highlighted() 相似,但参数为 文本。

connect(comboBox, &QComboBox::textActivated, this, [](const QString &text) {qDebug() << "Activated text:" << text;});connect(comboBox, &QComboBox::textHighlighted, this, [](const QString &text) {qDebug() << "Hovered text:" << text;});

相关文章:

Qt开发:QComboBox的使用

文章目录 一、概述二、QComboBox添加数据三、常用函数四、信号与槽函数 一、概述 QComboBox 是 Qt 提供的一个下拉列表控件&#xff0c;它允许用户从预定义的选项中进行选择&#xff0c;同时也支持手动输入自定义内容&#xff08;如果启用了可编辑模式&#xff09;。QComboBox…...

Manacher 马拉车算法

Manacher 马拉车算法 5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09; 马拉车算法是目前解决寻找字符串中最长的回文子串时间复杂度最低的算法&#xff08;线性O(n)&#xff09;. 中心扩散法 初始化一个长度与字符串 s 相等的 臂长数组 arr 和 最长臂长 max 与 最…...

centos7搭建postgresql12主从

主从搭建 192.168.159.101 node1 主库&#xff08;读写&#xff09; 192.168.159.102 node2 备库&#xff08;只读&#xff09; 两台机器首先安装postgrsql 主库 postgres用户操作&#xff1a; 修改postgresql.conf # 在文件中修改(此配置仅用于远程访问, 流复制后续还有额外…...

VL开源模型实现文本生成图片

一、 基础知识 根据描述生成图片的视觉-语言模型&#xff08;Vision-Language Models, VL 模型&#xff09;是近年来多模态生成领域的热点研究方向。这些模型能够根据自然语言描述生成高质量的图像&#xff0c;广泛应用于艺术创作、设计辅助、虚拟场景构建等领域。 1 根据描述…...

动态规划——分组背包问题

动态规划——分组背包问题 分组背包问题分组背包思路分组背包OJ分组背包OJ汇总 分组背包问题 N件物品和一个容量为V的背包。第i件物品的体积是w[i]&#xff0c;价值是v[i]。这些物品被划分为若干组&#xff0c;每组中的物品互相冲突&#xff0c;最多选一件。求解将哪些物品装入…...

Leetcode 3495. Minimum Operations to Make Array Elements Zero

Leetcode 3495. Minimum Operations to Make Array Elements Zero 1. 解题思路2. 代码实现 题目链接&#xff1a;3495. Minimum Operations to Make Array Elements Zero 1. 解题思路 这一题的话核心就是统计对任意自然数 n n n&#xff0c;从 1 1 1到 n n n当中所有的数字对…...

STM32 —— MCU、MPU、ARM、FPGA、DSP

在嵌入式系统中&#xff0c;MCU、MPU、ARM、FPGA和DSP是核心组件&#xff0c;各自在架构、功能和应用场景上有显著差异。以下从专业角度详细解析这些概念&#xff1a; 一、 MCU&#xff08;Microcontroller Unit&#xff0c;微控制器单元&#xff09; 核心定义 集成系统芯片&a…...

Linux高级IO

五种IO模型 具象化理解 IO&#xff1a;等 数据拷贝 read/recv&#xff1a; 1、等 - IO事件就绪 - 检测功能成分在里面 2、数据拷贝 问&#xff1a;什么叫做高效的IO&#xff1f; 答&#xff1a;单位时间&#xff0c;等的比重越小&#xff0c;IO的效率越高。 IO模型&am…...

机器人的手眼标定——机器人抓取系统基础系列(五)

机器人的手眼标定——机器人抓取系统基础系列&#xff08;五&#xff09; 前言一、机器人标定相关概念1.1 内参标定和外参标定1.2 Eye-in-Hand 和 Eye-to-Hand1.3 ArUco二维码和棋盘格标定区别 二、机器人标定基本原理2.1 机器人抓取系统坐标系2.2 标定原理 三、标定步骤和注意…...

Android 图片加载框架:Picasso vs Glide

引言 在 Android 开发中&#xff0c;图片加载是移动应用的核心功能之一。合理选择图片加载框架不仅能提升用户体验&#xff0c;还能优化内存管理和应用性能。本文将深入对比 Picasso 和 Glide 两大主流框架&#xff0c;结合代码示例分析它们的差异、工作原理及优化策略。 1. …...

uniapp从 vue2 项目迁移到 vue3流程

以下是必须为迁移到 vue3 进行调整的要点&#xff0c;以便 vue2 项目可以在 vue3 上正常运行。 1. 在index.js中创建应用程序实例 // Before - Vue 2 import Vue from vue import App from ./App // with no need for vue3 Vue.config.productionTip false // vue3 is no lon…...

DeepSeek R1 本地部署指南 (2) - macOS 本地部署

上一篇&#xff1a; DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 1.安装 Ollama Ollama https://ollama.com/ 点击 Download - Download for macOS 解压下载 zip 启动程序 3. 选择版本 DeepSeek R1 版本 deepseek-r1 https://ollama.com/library/deepseek-r1 模…...

DeepSeek技术架构解析:MoE混合专家模型

一、前言 2025年初&#xff0c;DeepSeek V3以557万美元的研发成本&#xff08;仅为GPT-4的1/14&#xff09;和开源模型第一的排名&#xff0c;在全球AI领域掀起波澜。其核心创新之一——混合专家模型&#xff08;Mixture of Experts, MoE&#xff09;的优化设计&#xff0c;不…...

Ubuntu实时读取音乐软件的音频流

文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的&#xff0c;我需要在Ubuntu中&#xff0c;实时读取正在播放音乐的音频流&#xff0c;然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现&#xff0c;好处是可以直接利用Helvum…...

2025年2月-3月后端go开发找工作感悟

整体感悟 目标 找工作首先要有一个目标&#xff0c;这个目标尽可能的明确&#xff0c;比如我要字节、拼多多之类的公司&#xff0c;还是要去百度、滴滴这样的&#xff0c;或者目标是创业公司。但是这个目标是会动态调整的&#xff0c;有可能我们的心态发生了变化&#xff0c;一…...

OpenCV图像拼接(1)自动校准之校准旋转相机的函数calibrateRotatingCamera()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::calibrateRotatingCamera 是OpenCV中用于校准旋转相机的函数。它特别适用于那种相机相对于一个固定的场景进行纯旋转运动的情况&…...

【极速版 -- 大模型入门到进阶】快速了解大型语言模型

文章目录 &#x1f30a; 大模型作为一种生成式人工智慧&#xff0c;厉害在哪儿&#xff1f;-> 通用能力&#x1f30a; LLM 如何生成输出&#xff1a;简而言之就是文字接龙&#x1f30a; GPT 之前 ...&#xff1a;模型规模和数据规模概览&#x1f30a; ChatGPT 有三个训练阶段…...

MySQL 锁机制详解

MySQL 锁机制详解 5.1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、 RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数…...

牛客网【模板】二维差分(详解)c++

题目链接&#xff1a;【模板】二维差分 1.题目分析 类比一下&#xff0c;因为差分因为差分是在数组里的某一段同时加上一个K二维是在二维数组中选择一个词矩阵&#xff0c;让词矩阵中每一个元素都加上一个K 2.算法原理 解法-:暴力解法 -> 模拟 你告诉我一个左上角和右下…...

从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!

我正在参加Trae「超级体验官」创意实践征文&#xff0c; 本文所使用的 Trae 免费下载链接&#xff1a; www.trae.ai/?utm_source… 前言 大家好&#xff0c;我是小Q&#xff0c;字节跳动近期推出了一款 AI IDE—— Trae&#xff0c;由国人团队开发&#xff0c;并且限时免费体…...

【清华大学】AIGC发展研究(3.0版)

目录 AIGC发展研究报告核心内容一、团队简介二、AI哲学三、国内外大模型四、生成式内容&#xff08;一&#xff09;文本生成&#xff08;二&#xff09;图像生成&#xff08;三&#xff09;音乐生成&#xff08;四&#xff09;视频生成 五、各行业应用六、未来展望 AIGC发展研究…...

Kafka--常见问题

1.为什么要使用 Kafka&#xff0c;起到什么作用 Kafka是一个高吞吐量、分布式、基于发布订阅的消息系统&#xff0c;它主要用于处理实时数据流 Kafka 设计上支持高吞吐量的消息传输&#xff0c;每秒可以处理数百万条消息。它能够在处理大量并发请求时&#xff0c;保持低延迟和…...

maptalks图层交互 - 模拟 Tooltip

maptalks图层交互 - 模拟 Tooltip 图层交互-模拟tooltip官方文档 <!DOCTYPE html> <html><meta charsetUTF-8 /><meta nameviewport contentwidthdevice-width, initial-scale1 /><title>图层交互 - 模拟 Tooltip</title><style typet…...

【前端】Visual Studio Code安装配置教程:下载、汉化、常用组件、基本操作

文章目录 一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感谢观看&#xff01; 一、Visual Studio Code下载 下载官网&#xff1a;https://code.visualstudio.com/ 进入官网后点击右上角的Download &…...

datetime“陷阱”与救赎:扒“时间差值”证道

时间工具陷阱&#xff0c;其实是工具引用的误解。 笔记模板由python脚本于2025-03-23 23:32:58创建&#xff0c;本篇笔记适合时间工具研究的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Pyth…...

3DMAX曲线生成器插件CurveGenerator使用方法

1. 脚本功能简介 3DMAX曲线生成器插件CurveGenerator是一个用于 3ds Max 的样条线生成工具&#xff0c;用户可以通过简单的UI界面输入参数&#xff0c;快速生成多条样条线。每条样条线的高度值随机生成&#xff0c;且可以自定义以下参数&#xff1a; 顶点数量&#xff1a;每条…...

Apache漏洞再现

CVE-2021-41773路径穿越漏洞 1、开环境 sudo docker pull blueteamsteve/cve-2021-41773:no-cgid sudo docker run -dit -p 8082:80 blueteamsteve/cve-2021-41773:no-cgid 2、访问8082端口 3、打开工具 4、输入网址&#xff0c;检测漏洞...

git,openpnp - 根据安装程序打包名称找到对应的源码版本

文章目录 git,openpnp - 根据安装程序打包名称找到对应的源码版本概述笔记备注 - 提交时间不可以作为查找提交记录的依据END git,openpnp - 根据安装程序打包名称找到对应的源码版本 概述 想在openpnp官方最新稳定版上改一改&#xff0c;首先就得知道官方打包的安装程序对应的…...

SQL Server查询计划操作符(7.3)——查询计划相关操作符(11)

7.3. 查询计划相关操作符 98&#xff09;Table Scan&#xff1a;该操作符从查询计划参数列确定的表中获取所有数据行。如果其参数列中出现WHERE:()谓词&#xff0c;则只返回满足该谓词的数据行。该操作符为逻辑操作符和物理操作符。该操作符具体如图7.3-98节点1所示。 图 7.3-…...

编译原理——词法分析

文章目录 词法分析&#xff1a;从基础到自动构造一、词法分析程序的设计一、词法分析程序的设计二、PL/0编译程序中词法分析程序的设计与实现1. 语法特定考量2. 通过状态转移表运用有限状态自动机3. 示例代码片段&#xff08;用于说明的伪代码&#xff09; 三、单词的形式化描述…...

Linux内核,内存分布

x86_64的物理地址范围为64bit&#xff0c;但是因为地址空间太大目前不可能完全用完&#xff0c;当前支持57bit和48bit两种虚拟地址模式。 地址模式单个空间用户地址空间内核地址空间32位2G0x00000000 - 0x7FFFFFFF0x80000000 - 0xFFFFFFFF64位(48bit)128T0x00000000 00000000 …...

AI鸟类识别技术革新生态监测:快瞳科技如何用“智慧之眼”守护自然?

在生态环境保护日益受关注的今天&#xff0c;“鸟类识别”已从专业科研工具演变为推动生态治理数字化的核心技术。无论是湿地保护区的珍稀候鸟监测&#xff0c;还是城市机场的鸟击风险预警&#xff0c;AI技术的精准赋能正在改写人类与自然的互动方式。作为行业领先的智能解决方…...

c++之set

一、set特性及用途&#xff1f; 唯一性&#xff1a;set 中的元素是唯一的&#xff0c;不会存在重复的元素。自动排序&#xff1a;set 中的元素会自动按照默认的升序规则进行排序。底层实现&#xff1a;set 通常基于红黑树实现&#xff0c;具有自平衡功能&#xff0c;因此插入、…...

【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

目录 一、前言 二、AI视频概述 2.1 什么是AI视频 2.2 AI视频核心特点 2.3 AI视频应用场景 三、通义万相介绍 3.1 通义万相概述 3.1.1 什么是通义万相 3.2 通义万相核心特点 3.3 通义万相技术特点 3.4 通义万相应用场景 四、DeepSeek 通义万相制作AI视频流程 4.1 D…...

【操作系统】自旋锁和互斥锁

自旋锁和互斥锁是用于多线程同步的两种常见锁机制&#xff0c;主要区别在于等待锁的方式和适用场景。以下是它们的对比分析&#xff1a; 1. 等待机制 自旋锁&#xff08;Spinlock&#xff09;互斥锁&#xff08;Mutex&#xff09;线程通过 忙等待&#xff08;Busy-Wait&#x…...

人工智能在医疗影像诊断中的应用与实践

引言 随着人工智能技术的飞速发展&#xff0c;其在医疗领域的应用逐渐成为研究和实践的热点。特别是在医疗影像诊断方面&#xff0c;人工智能技术凭借其强大的数据处理能力和模式识别能力&#xff0c;为提高诊断效率和准确性带来了新的希望。本文将探讨人工智能在医疗影像诊断中…...

Java中synchronized 和 Lock

1. synchronized 关键字 工作原理 对象锁&#xff1a;在Java中&#xff0c;每个对象都有一个与之关联的监视器锁&#xff08;monitor lock&#xff09;。当一个线程尝试进入由 synchronized 保护的代码块或方法时&#xff0c;它必须首先获取该对象的监视器锁。如果锁已经被其…...

【C语言系列】数据在内存中存储

数据在内存中存储 一、整数在内存中的存储二、大小端字节序和字节序判断2.1什么是大小端&#xff1f;2.2练习2.2.1练习12.2.2练习22.2.3练习32.2.4练习42.2.5练习52.2.6练习6 三、浮点数在内存中的存储3.1练习3.2浮点数的存储3.2.1 浮点数存的过程3.2.2 浮点数取的过程 3.3题目…...

qt 对QObject::tr()函数进行重定向

在 Qt 中&#xff0c;QObject::tr() 函数用于国际化&#xff08;i18n&#xff09;&#xff0c;它用于标记需要翻译的字符串。通常情况下&#xff0c;tr() 函数会从翻译文件&#xff08;如 .qm 文件&#xff09;中查找对应的翻译字符串。如果你希望重定向 tr() 函数的行为&#…...

C#基础学习(三)值类型和引用类型:编程世界的“现金“ vs “银行卡“,以及string这个“渣男“的叛变行为

开场白 各位程序猿/媛们&#xff0c;今天我们来聊一聊编程世界里的"金钱观"。 你以为只有人类会纠结现金和存款的区别&#xff1f;不不不&#xff0c;C#中的值类型和引用类型每天都在上演这场大戏&#xff01; 而我们的string同学&#xff0c;表面是…...

自动驾驶背后的数学:多模态传感器融合的简单建模

上一篇博客自动驾驶背后的数学:特征提取中的线性变换与非线性激活 以单个传感器为例,讲解了特征提取中的线性变换与非线性激活。 这一篇将以多模态传感器融合为例,讲解稍复杂的线性变换和非线性激活应用场景。 (一)权重矩阵的张量积分解 y = W x + b = [ w 11 ⋯ w 1 n ⋮…...

如何设置sudo权限

打开终端&#xff1a;按 Ctrl Alt T 打开终端。 编辑 sudoers 文件&#xff1a; 使用 visudo 命令编辑 /etc/sudoers 文件&#xff08;visudo 会检查语法&#xff0c;避免错误&#xff09;&#xff1a; sudo visudo 添加用户权限&#xff1a; 在文件中找到以下行&#xff1…...

Codeforces Round 1012 (Div. 2) 3.23

文章目录 2025.3.23 Div2B. Pushing Balls&#xff08;暴力&#xff09;代码 C. Dining Hall题意思路代码 2025.3.23 Div2 Dashboard - Codeforces Round 1012 (Div. 2) - Codeforces B. Pushing Balls&#xff08;暴力&#xff09; 题意很好懂&#xff0c;每一行每一列从左…...

langfuse追踪Trace

介绍 &#x1f9e0; Langfuse 是什么&#xff1f; Langfuse 是一个专门为 LLM 应用&#xff08;如 OpenAI / LangChain / 自定义 Agent&#xff09; 设计的 观测与追踪平台&#xff08;Observability Platform&#xff09;。 简单说&#xff0c;它就像是你为 AI 应用插上的 “…...

Java-模块二-2

整数类型 byte&#xff1a;在 Java 中占用8位&#xff08;1字节&#xff09;&#xff0c;因此它的取值范围是从 -128 到 127。这是最小的整数类型&#xff0c;适合用于节省空间的情况。 short&#xff1a;这种类型的大小是16位&#xff08;2字节&#xff09;&#xff0c;允许的…...

使用VS2022编译CEF

前提 选择编译的版本 CEF自动编译&#xff0c;在这里可以看到最新的稳定版和Beta版。 从这里得出&#xff0c;最新的稳定版是134.0.6998.118&#xff0c;对应的cef branch是6998。通过这个信息可以在Build requirements查到相关的软件配置信息。 这里主要看Windows下的编译要…...

大模型RLHF训练-PPO算法详解:Proximal Policy Optimization Algorithms

一、TL&#xff1b;DR 提出了一种新的策略梯度方法家族&#xff0c;用于强化学习&#xff0c;这些方法交替进行与环境交互采样数据提出了一个新的目标函数&#xff0c;使得能够进行多个小批量更新的多轮训练这些新方法为近端策略优化&#xff08;Proximal Policy Optimization…...

【STM32实物】基于STM32的扫地机器人/小车控制系统设计

基于STM32的扫地机器人/小车控制系统设计 演示视频: 基于STM32的扫地机器人小车控制系统设计 简介:扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采…...

【C++初阶】从零开始模拟实现vector(含迭代器失效详细讲解)

目录 1、基本结构 1.1成员变量 1.2无参构造函数 1.3有参构造函数 preserve()的实现 代码部分&#xff1a; push_back()的实现 代码部分&#xff1a; 代码部分&#xff1a; 1.4拷贝构造函数 代码部分&#xff1a; 1.5支持{}初始化的构造函数 代码部分&#xff1a; …...

AI比人脑更强,因为被植入思维模型【21】冯诺依曼思维模型

定义 冯诺依曼思维模型是一种基于数理逻辑和系统分析的思维方式&#xff0c;它将复杂的问题或系统分解为若干个基本的组成部分&#xff0c;通过建立数学模型和逻辑规则来描述和分析这些部分之间的关系&#xff0c;进而实现对整个系统的理解和优化。该模型强调从整体到局部、再…...