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

【Qt开发流程之】布局管理

介绍

一个界面呈现,如果要让用户有更好的观感,布局必不可少。
【Qt之布局】QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout介绍及使用
链接: https://blog.csdn.net/MrHHHHHH/article/details/133915208

qt布局类图:
在这里插入图片描述
Qt布局是Qt图形用户界面框架中的一种自动布局机制,它可以根据窗口大小和内容自动调整控件位置和大小。Qt提供了多种布局,如水平布局、垂直布局、网格布局等。开发者可以使用布局来快速构建自适应的界面。

使用布局有以下步骤:

  1. 创建一个QWidget或QMainWindow。
  2. 创建需要放入布局中的控件。
  3. 创建布局,例如QHBoxLayout、QVBoxLayout或QGridLayout。
  4. 将控件添加到布局中。
  5. 将布局应用到QWidget或QMainWindow上。

QBoxLayout

QBoxLayout类水平或垂直排列子部件。
QBoxLayout获取它(从父布局或parentWidget())获得的空间,将其划分为一排框,并使每个托管小部件填充一个框。
水平布局:
在这里插入图片描述
垂直布局:
在这里插入图片描述
示例:
水平布局

    horizontalGroupBox = new QGroupBox(tr("Horizontal layout"));QHBoxLayout *layout = new QHBoxLayout;for (int i = 0; i < NumButtons; ++i) {buttons[i] = new QPushButton(tr("Button %1").arg(i + 1));layout->addWidget(buttons[i]);}horizontalGroupBox->setLayout(layout);

垂直布局

	QWidget *widget = new QWidget;QPushButton *btn1 = new QPushButton("Button 1", widget);QPushButton *btn2 = new QPushButton("Button 2", widget);QPushButton *btn3 = new QPushButton("Button 3", widget);QVBoxLayout *layout = new QVBoxLayout(widget);layout->addWidget(btn1);layout->addWidget(btn2);layout->addWidget(btn3);widget->setLayout(layout);widget->setGeometry(300, 300, 300, 200);widget->show();

QFormLayout

QFormLayout类管理输入小部件的表单及其相关标签。
QFormLayout是一个方便的布局类,它以两列的形式布局它的子类。左列由标签组成,右列由“字段”小部件(行编辑器、旋转框等)组成。
在这里插入图片描述
示例:

  QFormLayout *formLayout = new QFormLayout;formLayout->addRow(tr("&Name:"), nameLineEdit);formLayout->addRow(tr("&Email:"), emailLineEdit);formLayout->addRow(tr("&Age:"), ageSpinBox);setLayout(formLayout);

QGridLayout

QGridLayout类在网格中布局小部件。
QGridLayout占用它可用的空间(通过其父布局或parentWidget()),将其划分为行和列,并将它管理的每个小部件放入正确的单元格中。
列和行行为相同;我们将讨论列,但是行也有等价的函数。
每个列都有一个最小宽度和一个拉伸系数。最小宽度是使用setColumnMinimumWidth()设置的最大宽度,以及该列中每个小部件的最小宽度。拉伸因子是使用setColumnStretch()设置的,它决定了列的可用空间将超过其必要的最小值。
通常,使用addWidget()将每个托管小部件或布局放入自己的单元格中。使用addItem()和addWidget()的行和列跨越重载,小部件也可能占用多个单元格。如果这样做,QGridLayout将猜测如何在列/行上分配大小(基于拉伸因子)。
要从布局中删除小部件,请调用removeWidget()。在小部件上调用QWidget::hide()还可以有效地从布局中删除小部件,直到调用QWidget::show()。
在这里插入图片描述

示例:

  nameLabel = new QLabel(tr("&Name:"));nameLabel->setBuddy(nameLineEdit);emailLabel = new QLabel(tr("&Name:"));emailLabel->setBuddy(emailLineEdit);ageLabel = new QLabel(tr("&Name:"));ageLabel->setBuddy(ageSpinBox);QGridLayout *gridLayout = new QGridLayout;gridLayout->addWidget(nameLabel, 0, 0);gridLayout->addWidget(nameLineEdit, 0, 1);gridLayout->addWidget(emailLabel, 1, 0);gridLayout->addWidget(emailLineEdit, 1, 1);gridLayout->addWidget(ageLabel, 2, 0);gridLayout->addWidget(ageSpinBox, 2, 1);setLayout(gridLayout);

QStackedLayout

QStackedLayout类提供了一个窗口小部件堆栈,其中一次只有一个窗口小部件可见。
QStackedLayout可用于创建类似于QTabWidget提供的用户界面。在qstackkedlayout之上还有一个方便的qstackkedwidget类。

QStackedLayout可以用许多子部件(“页面”)填充。例如:

QWidget *firstPageWidget =新QWidget;
QWidget *secondPageWidget = new QWidget;
QWidget *thirdPageWidget = new QWidget;qstackkedlayout * stackkedlayout = new qstackkedlayout;
stackedLayout - > addWidget (firstPageWidget);
stackedLayout - > addWidget (secondPageWidget);
stackedLayout - > addWidget (thirdPageWidget);QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout - > addLayout (stackedLayout);
setLayout (mainLayout);

QStackedLayout没有为用户提供切换页面的内在方法。这通常是通过QComboBox或QListWidget来完成的,它们存储QStackedLayout页面的标题。例如:

QComboBox *pageComboBox = new QComboBox;
pageComboBox - > addItem (tr(“第1页”));
pageComboBox - > addItem (tr(2));
pageComboBox - > addItem (tr(3));
连接(pageComboBox信号(激活(int)),
stackedLayout槽(setCurrentIndex (int)));

综合使用布局示例

真正使用时,一定是将他们结合起来使用。
先上UI:
在这里插入图片描述
sizeHint()minimunSizeHint():这两个方法是继承QWidget类的虚函数。
sizeHint():大小提示,不同部件默认拥有不同的大小
minimunSizeHint():最小大小提示,建议最小大小提示
sizePolicy策略:

ConstantValueDescription
QSizePolicy::Fixed0The QWidget::sizeHint() is the only acceptable alternative, so the widget can never grow or shrink (e.g. the vertical direction of a push button).QWidget::sizeHint()是唯一可接受的替代方法,因此小部件永远不能增长或缩小(例如,按钮的垂直方向)。
QSizePolicy::MinimumGrowFlagThe sizeHint() is minimal, and sufficient. The widget can be expanded, but there is no advantage to it being larger (e.g. the horizontal direction of a push button). It cannot be smaller than the size provided by sizeHint().sizeHint()是最小的,也是足够的。小部件可以扩展,但它变大没有好处(例如,按钮的水平方向)。它不能小于sizeHint()提供的大小。
QSizePolicy::MaximumShrinkFlagThe sizeHint() is a maximum. The widget can be shrunk any amount without detriment if other widgets need the space (e.g. a separator line). It cannot be larger than the size provided by sizeHint().sizeHint()是一个最大值。如果其他部件需要空间(例如分隔线),则小部件可以任意缩小而不会损害。它不能大于sizeHint()提供的大小。
QSizePolicy::PreferredGrowFlag ShrinkFlagThe sizeHint() is best, but the widget can be shrunk and still be useful. The widget can be expanded, but there is no advantage to it being larger than sizeHint() (the default QWidget policy).sizeHint()是最好的,但是小部件可以缩小,但仍然有用。小部件可以展开,但是它比sizeHint()(默认的QWidget策略)大没有好处。
QSizePolicy::ExpandingGrowFlag ShrinkFlag ExpandFlagThe sizeHint() is a sensible size, but the widget can be shrunk and still be useful. The widget can make use of extra space, so it should get as much space as possible (e.g. the horizontal direction of a horizontal slider).sizeHint()是一个合理的大小,但是小部件可以缩小并且仍然有用。小部件可以利用额外的空间,所以它应该得到尽可能多的空间(例如,水平滑块的水平方向)。
QSizePolicy::MinimumExpandingGrowFlag ExpandFlagThe sizeHint() is minimal, and sufficient. The widget can make use of extra space, so it should get as much space as possible (e.g. the horizontal direction of a horizontal slider).sizeHint()是最小的,也是足够的。小部件可以利用额外的空间,所以它应该得到尽可能多的空间(例如,水平滑块的水平方向)。
QSizePolicy::IgnoredShrinkFlag GrowFlag IgnoreFlagThe sizeHint() is ignored. The widget will get as much space as possible.sizeHint()被忽略。小部件将获得尽可能多的空间。

.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE
class QAction;
class QDialogButtonBox;
class QGroupBox;
class QLabel;
class QLineEdit;
class QMenu;
class QMenuBar;
class QPushButton;
class QTextEdit;
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog();private:void createMenu();void createHorizontalGroupBox();void createGridGroupBox();void createFormGroupBox();enum { NumGridRows = 3, NumButtons = 4 };QMenuBar *menuBar;QGroupBox *horizontalGroupBox;QGroupBox *gridGroupBox;QGroupBox *formGroupBox;QTextEdit *smallEditor;QTextEdit *bigEditor;QLabel *labels[NumGridRows];QLineEdit *lineEdits[NumGridRows];QPushButton *buttons[NumButtons];QDialogButtonBox *buttonBox;QMenu *fileMenu;QAction *exitAction;
};#endif // DIALOG_H

.cpp

#include <QtWidgets>#include "dialog.h"Dialog::Dialog()
{createMenu();createHorizontalGroupBox();createGridGroupBox();createFormGroupBox();bigEditor = new QTextEdit;bigEditor->setPlainText(tr("This widget takes up all the remaining space ""in the top-level layout."));buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel);connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));QVBoxLayout *mainLayout = new QVBoxLayout;mainLayout->setMenuBar(menuBar);mainLayout->addWidget(horizontalGroupBox);mainLayout->addWidget(gridGroupBox);mainLayout->addWidget(formGroupBox);mainLayout->addWidget(bigEditor);mainLayout->addWidget(buttonBox);setLayout(mainLayout);setWindowTitle(tr("Basic Layouts"));
}void Dialog::createMenu()
{menuBar = new QMenuBar;fileMenu = new QMenu(tr("&File"), this);exitAction = fileMenu->addAction(tr("E&xit"));menuBar->addMenu(fileMenu);connect(exitAction, SIGNAL(triggered()), this, SLOT(accept()));
}void Dialog::createHorizontalGroupBox()
{horizontalGroupBox = new QGroupBox(tr("Horizontal layout"));QHBoxLayout *layout = new QHBoxLayout;for (int i = 0; i < NumButtons; ++i) {buttons[i] = new QPushButton(tr("Button %1").arg(i + 1));layout->addWidget(buttons[i]);}horizontalGroupBox->setLayout(layout);
}void Dialog::createGridGroupBox()
{gridGroupBox = new QGroupBox(tr("Grid layout"));QGridLayout *layout = new QGridLayout;for (int i = 0; i < NumGridRows; ++i) {labels[i] = new QLabel(tr("Line %1:").arg(i + 1));lineEdits[i] = new QLineEdit;layout->addWidget(labels[i], i + 1, 0);layout->addWidget(lineEdits[i], i + 1, 1);}smallEditor = new QTextEdit;smallEditor->setPlainText(tr("This widget takes up about two thirds of the ""grid layout."));layout->addWidget(smallEditor, 0, 2, 4, 1);layout->setColumnStretch(1, 10);layout->setColumnStretch(2, 20);gridGroupBox->setLayout(layout);
}void Dialog::createFormGroupBox()
{formGroupBox = new QGroupBox(tr("Form layout"));QFormLayout *layout = new QFormLayout;layout->addRow(new QLabel(tr("Line 1:")), new QLineEdit);layout->addRow(new QLabel(tr("Line 2, long text:")), new QComboBox);layout->addRow(new QLabel(tr("Line 3:")), new QSpinBox);formGroupBox->setLayout(layout);
}

main.cpp

#include <QApplication>#include "dialog.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);Dialog dialog;dialog.show();return app.exec();
}

分裂器

在这里插入图片描述
选择控件后,上方工具栏会亮
在这里插入图片描述
使用分裂器,可以设置伸缩因子,界面显示更加美观,合理,更符合人体工程学。

设置伙伴

在这里插入图片描述
设置伙伴后,可以将文本名称中添加&符号,这样按Alt+&后面的字符就可以对设置的伙伴就行操作。

设置Tab键顺序

设置Tab键顺序,这样启动程序后,使用tab键可以按照指定顺序就行控件焦点选择
在这里插入图片描述

定位器

在这里插入图片描述
如:
输入l 9,就会定位当当前文件的第九行。

结论

对于一个成熟的软件,合理的布局是必要的。

相关文章:

【Qt开发流程之】布局管理

介绍 一个界面呈现&#xff0c;如果要让用户有更好的观感&#xff0c;布局必不可少。 【Qt之布局】QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout介绍及使用 链接: https://blog.csdn.net/MrHHHHHH/article/details/133915208 qt布局类图&#xff1a; Qt布局是Qt图形…...

建筑可视化中的 3D 纹理

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1、什么是 3D 纹理&#xff1f; 纹理是将二维图像添加到三维模型的技术艺术。虽然对物体进行纹…...

9.docker镜像Tag为none的原因

1.现象 使用docker images命令查看镜像列表&#xff0c;会发现存在许多标签为none的镜像&#xff1a; 2. 原因 docker镜像标签为none的原因如下&#xff1a; &#xff08;1&#xff09;构建或重新拉取同名同Tag的新镜像&#xff1a;构建或重新拉取同名同Tag的新镜像后&…...

HTML5学习系列之响应式图像

HTML5学习系列之响应式图像 前言响应式图像响应视图大小响应屏幕方向响应像素密度响应图像格式自适应像素比自适应视图宽 总结 前言 学习记录 响应式图像 响应视图大小 容器 srcset&#xff1a;图片地址&#xff0c;必需有。media&#xff1a;设置媒体查询。sizes&#xff…...

基于数据库(MySQL)与缓存(Redis)实现分布式锁

分布式锁 分布式锁&#xff1a;分布式锁是在分布式的情况下实现互斥类型的一种锁 实现分布式锁需要满足的五个条件 可见性&#xff1a;多个进程都能看到结果互斥性&#xff1a;只允许一个持有锁的对象的进入临界资源可用性&#xff1a;无论何时都要保证锁服务的可用性&#x…...

2023年A特种设备相关管理(锅炉压力容器压力管道)证模拟考试题库及A特种设备相关管理(锅炉压力容器压力管道)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;证模拟考试题库及A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;理论考试试题是由安全生产模拟考试一点通提供&#xff0c;A特…...

系统及其存储相关

1.区分系统&#xff08;软件&#xff09;和固件 1.1概念辨别 系统&#xff08;软件software&#xff09;&#xff1a; 角色&#xff1a; 系统是计算机中的核心软件&#xff0c;提供基本的管理、控制和资源分配功能。它通常包括操作系统&#xff0c;负责管理硬件资源、提供用户…...

鸿蒙原生应用开发-折叠屏、平板设备服务卡片适配

一、多设备卡片适配原则 为不同尺寸的卡片提供不同的功能 在卡片开发过程中请考虑适配不同尺寸的设备&#xff0c;特别是在折叠屏和平板设备上&#xff0c;设备屏幕尺寸的变化直接影响了卡片内容的展示。请发挥想象力设计具有自适应能力的卡片&#xff0c;避免在卡片内容不做…...

android查漏补缺(8)Android广播不同种类介绍

按照是否有序分类 1&#xff0c;普通广播&#xff08;无序广播&#xff09; 广播按照逻辑上同一时刻&#xff08;实际可能被CPU按照抢占式任务无序发给注册模块&#xff09;发送给注册模块 #发送方法&#xff1a; Context.sendBroadcast() 2&#xff0c;有序广播 广播按照…...

什么是美颜SDK?直播美颜SDK技术深度剖析

在实现实时美颜的过程中&#xff0c;美颜SDK扮演着关键的角色&#xff0c;它为开发者提供了一套强大的工具&#xff0c;使得实时美颜效果能够轻松应用于直播平台。 一、美颜SDK的基本概念 美颜SDK是一种软件工具包&#xff0c;通过集成了丰富的图像处理算法和实时计算技术&a…...

红海营销时代,内容占位的出海品牌更有机会营销占位

#01 品牌出海&#xff1a;内容占位就是品牌营销占位 红海营销时代&#xff0c;内容信息充斥着用户周边。无论线上还是线下&#xff0c;生活工作、休闲娱乐等不同场景内&#xff0c;广告信息均无孔不入。对于用户来说&#xff0c;能记住的品牌或者商品往往寥寥无几。 占位营销…...

解决龙芯loongarch64服务器编译安装Python后yum命令无法使用的问题“no module named ‘dnf‘”

引言 在使用Linux系统时,我们经常会使用yum来管理软件包。然而,有时候我们可能会遇到yum不可用的情况,其中一个原因就是Python的问题。本文将介绍Python对yum可用性的影响,并提供解决方案。 问题引发 正常情况下,安装linux系统后,yum命令是可用状态,升级Python版本后,…...

Leetcode2937. 使三个字符串相等

Every day a Leetcode 题目来源&#xff1a;2937. 使三个字符串相等 解法1&#xff1a;枚举 设 len1、len2、len3 分别为字符串 s1、s2、s3 的长度。 min_len 是 3 个字符串长度的最小值。 枚举 len min_len 到 len 1&#xff0c;设 t1、t2、t3 分别是字符串 s1、s2、s…...

<MySQL> 如何合理的设计数据库中的表?数据表设计的三种关系

目录 一、表的设计 二、一对一关系 三、一对多关系 四、多对多关系 一、表的设计 数据库设计就是根据需要创建出符合需求的表。 首先根据需求找到体系中的关键实体对象&#xff0c;通常每个实体对象都会有一个表&#xff0c;表中包含了这个实体的相关属性。 再理清楚实体对…...

基于操作系统讨论Java线程与进程、浅谈Go的线程与管程

文章目录 操作系统中的进程进程概念进程的状态 Java中的进程Java进程的概念Java进程的特性Java进程的状态Java进程与操作系统进程的通信 操作系统的进程和Java进程的区别联系操作系统进程Java 进程区别和联系 操作系统中的线程动机优点多核编程 Java中的线程定义&#xff1a;特…...

CICD 持续集成与持续交付——jenkins

部署 软件下载&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/ [rootcicd2 ~]# rpm -ivh jdk-11.0.15_linux-x64_bin.rpm[rootcicd2 ~]# yum install -y fontconfig[rootcicd2 ~]# rpm -ivh jenkins-2.432-1.1.noarch.rpm启动服务 [rootcicd2 ~]# systemctl…...

【Zabbix】Zabbix Agent 2在Ubuntu/Debian系统上的安装

一、Zabbix Agent 2介绍 Zabbix Agent 2是一款监控软件&#xff0c;由Zabbix SIA开发。Zabbix Agent 2可以提供系统、服务、应用程序和网络设备的监控及性能指标数据收集。它是通过在被监视的主机上运行来获取数据。Zabbix Agent 2可以在Linux、Unix、Windows和MAC平台上运行&…...

浅谈无线测温产品在菲律宾某工厂配电项目的应用

摘要&#xff1a;配电系统是由多种配电设备和配电设施所组成的变换电压和直接向终端用户分配电能的一个电力网络系统。由于配电系统作为电力系统的一个环节直接面向终端用户&#xff0c;它的完善与否直接关系着广大用户的用电可靠性和用电质量&#xff0c;因而在电力系统中具有…...

软件工程第十一周

面向对象 面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;不仅仅是一种程序设计方法&#xff0c;它更是一种深刻的软件工程开发思想。这种思想的核心在于通过抽象和封装来模拟现实世界中的对象和概念&#xff0c;以便更好地管理和解决复杂的软件工程问…...

【从入门到起飞】JavaSE—带你了解Map,HashMap,TreeMap的使用方法

&#x1f38a;专栏【Java基础】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The truth that you leave】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f33a;双列集合的特点&#x1f384;Map&#x1f354;Ma…...

Prompt提示工程指南#Kontext图像到图像

重要提示&#xff1a;单个prompt的最大token数为512 # 核心能力 Kontext图像编辑系统能够&#xff1a; 理解图像上下文语义实现精准的局部修改保持原始图像风格一致性支持复杂的多步迭代编辑 # 基础对象修改 示例场景&#xff1a;改变汽车颜色 Prompt设计&#xff1a; Change …...

【方案分享】蓝牙Beacon定位精度优化(包含KF、EKF与UKF卡尔曼滤波算法详解)

蓝牙Beacon定位精度优化&#xff1a;KF、EKF与UKF卡尔曼滤波算法详解 标签&#xff1a;蓝牙定位&#xff5c;Beacon&#xff5c;卡尔曼滤波&#xff5c;UKF&#xff5c;EKF&#xff5c;RSSI&#xff5c;室内定位&#xff5c;滤波算法&#xff5c;精度优化 相关分享&#xff1a;…...

AI IDE 正式上线!通义灵码开箱即用

近期&#xff0c;通义灵码AI IDE正式上线&#xff0c;即日起用户可在通义灵码官网免费下载开箱即用。 作为AI原生的开发环境工具&#xff0c;通义灵码AI IDE深度适配了最新的千问3大模型&#xff0c;并全面集成通义灵码插件能力&#xff0c;具备编程智能体、行间建议预测、行间…...

OpenVINO环境配置--OpenVINO安装

TOC环境配置–OpenVINO安装 本节内容 OpenVINO 支持的安装方式有很多种&#xff0c;每一种操作系统以及语言都有对应的安装方法&#xff0c;在官网上有很详细的教程&#xff1a;   我们可以根据自己的需要&#xff0c;来点选环境配置和安装方法&#xff0c;然后网页会给出正…...

spring重试机制

数据库死锁处理与重试机制实现指南 1. 业务场景 1.1 问题现象 高并发批量数据处理时频繁出现数据库死锁主要发生在"先删除历史数据&#xff0c;再重新计算"的业务流程中原有逐条处理方式&#xff1a;list.forEach(item -> { delete(); calculate(); }) 1.2 死…...

上门服务小程序订单系统框架设计

一、逻辑分析 上门服务小程序订单系统主要涉及服务展示、用户下单、订单处理、服务人员接单与服务完成反馈等核心流程。 服务展示&#xff1a;不同类型的上门服务&#xff08;如家政、维修等&#xff09;需要在小程序中展示详细信息&#xff0c;包括服务名称、价格、服务内容介…...

Neo4j 数据建模:原理、技术与实践指南

Neo4j 作为领先的图数据库,其核心优势在于利用图结构直观地表达和高效地查询复杂关系。其数据建模理念与传统关系型数据库截然不同,专注于实体(节点)及其连接(关系)。以下基于官方文档,系统阐述其建模原理、关键技术、实用技巧及最佳实践: 一、 核心原理:以关系为中心…...

在 Ubuntu 24.04 LTS 上安装 Jenkins 并配置全局工具(Git、JDK、Maven)

在 Ubuntu 24.04 LTS 上安装 Jenkins 并配置全局工具(Git、JDK、Maven) Jenkins 是一款开源的持续集成和持续交付(CI/CD)工具,在 DevOps 实践中有着广泛的应用。本文将手把手带你在 Ubuntu 24.04 LTS 系统中完成 Jenkins 的安装,并配置所需的全局工具:Git、JDK 和 Maven…...

Linux编程:1、文件编程

一、Linux 文件编程与 C 语言文件编程的区别 特性C 语言 I/O 库函数Linux 文件编程&#xff08;系统调用&#xff09;实现层面用户空间&#xff08;glibc 库&#xff09;内核空间&#xff08;系统调用&#xff09;跨平台性跨平台&#xff08;Windows/Linux&#xff09;仅限 Li…...

【推荐算法】DeepFM:特征交叉建模的革命性架构

DeepFM&#xff1a;特征交叉建模的革命性架构 一、算法背景知识&#xff1a;特征交叉的演进困境1.1 特征交叉的核心价值1.2 传统方法的局限性 二、算法理论/结构&#xff1a;双路并行架构2.1 FM组件&#xff1a;显式特征交叉专家2.2 Deep组件&#xff1a;隐式高阶交叉挖掘机2.3…...