Qt常用的按钮控件编程(四)-- QCheckBox 按钮

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 6、`QCheckBox` 按钮
    • 6.1 例程功能和程序执行效果
    • 6.2 生成项目
    • 6.3 添加资源文件
      • 6.3.1 添加图片资源
      • 6.3.2 添加 `qss` 文件
    • 6.4 完成代码编辑
      • 6.4.1 修改项目文件 _radiobutton.pro
      • 6.4.2 修改 `main.cpp`
      • 6.4.3 修改 `widget.h`
      • 6.4.4 修改 `widget.cpp`
    • 6.5 切换Kit,获得运行在不同系统中的运行的执行文件
    • 6.6 程序中的qt机制
      • 6.6.1 `QButtonGroup`的`buttonToggled` 和 `buttonClicked`信号
      • 6.6.2 QAbstractButton 类
  • 总结


前言

本文介绍QT常用控件的第四个按钮,QCheckBox 按钮编程。通过这个例子,进一步巩固QT管理资源机制,学习QCheckBox 复选框的三态功能和如何分组管理QCheckBox 复选框 。项目演示如何使用默认的分组和 QButtonGroup 进行多选设置。项目使用样式表文件进行外观设置。
文章中使用的例程和内容都是在chatgpt的帮助下完成的,例程经过测试通过。

感谢朋友提供的chatgpt软件,特别是其中的gpt-box桌面工具,更是我离不开的工具。感兴趣的同仁可前往一观(apsuai.com)。

我们的调试环境仍然是双架构Kits,编译调试在当前的ubuntu(qt5)中进行,重新编译后下载到目标arm设备(qt4)中运行。
我们的编程环境为:Ubuntu64位系统(22.04),目标架构:(1)qt5 x86_64 架构,(2)qt4 32位arm架构。
环境配置请参见《Qt常用的按钮控件编程(一)》第1节。


6、QCheckBox 按钮

QCheckBox是Qt框架中的一个控件类,它代表了一个复选框,用于允许用户对一组选项进行多项选择。QCheckBox通常出现在界面上的选项列表或设置界面中。
QCheckBox继承自QAbstractButton类,因此它具有与其他按钮控件相同的属性和方法。例如,可以使用setChecked()方法设置QCheckBox的选中状态,并使用text()方法获取显示文本。

QCheckBox还提供了一些额外的功能,例如支持三态状态(即“选中”、“未选中”和“半选中”)和部分透明度。可以通过setTristate()方法启用三态状态,或通过setCheckState()方法设置其状态。另外,可以使用setOpacity()方法设置QCheckBox的不透明度。
下面是几个常用的QCheckBox方法:

  • setText(const QString &text):设置QCheckBox的显示文本。
    
  • setChecked(bool checked):设置QCheckBox的选中状态。
    
  • isChecked():返回QCheckBox的选中状态。
    
  • setTristate(bool y):启用/禁用QCheckBox的三态状态。
    
  • setCheckState(Qt::CheckState state):设置QCheckBox的选中状态,包括Qt::Checked、Qt::Unchecked和Qt::PartiallyChecked。
    
  • checkState():返回QCheckBox的选中状态,包括Qt::Checked、Qt::Unchecked和Qt::PartiallyChecked。

6.1 例程功能和程序执行效果

创建一个基于 Qt QCheckBox 按钮c++例程,项目名称"_qcheckbox" ,不使用拖取控件,控件全部采用编程。主窗口上放置三个QCheckBox 按钮分为两组:

  • 第一组:一个按钮,是一个三态复选框,三种状态为选中,未选中,半选中;
  • 第二组:两个按钮,放在QButtonGroup 控件中,可以多选,有选中、未选中两种状态;
  • 程序包括三个控件的响应函数(两个槽函数)。
  • 编译完成后生成两个同名可执行程序_qcheckbox,一个使用使用Qt4库,运行在arm架构设备,另一个使用Qt5库,运行在当前ubuntu系统。
    程序执行效果:
    (1)程序启动后效果:
    在这里插入图片描述(2)点击后执行效果(其中之一):

在这里插入图片描述

6.2 生成项目

打开 Qt Creator 并创建一个新的 应用程序项目_qcheckbox,选择Widget作为基类,不要勾选“Generate form”,,不使用拖取控件,控件全部采用编程,将两个配置好的Kits同时选上,项目新建完成如下图。(详细的项目新建过程参见:《Qt常用的按钮控件编程(一)》)。

在这里插入图片描述

6.3 添加资源文件

在本例程的项目目录的images 文件夹中准备了3张图片(如下图),下面的步骤演示了如何将资源添加到项目中。
在这里插入图片描述

6.3.1 添加图片资源

  • 在项目目录中右键点击 Resources 目录,选择 Add New… ,并选择 Qt -> Qt Resource File。
    在这里插入图片描述在这里插入图片描述- 输入资源文件的名称(自行定义)和位置,然后点击“下一步”。
    在这里插入图片描述

在 Qt Creator 中新建资源文件后,默认会进入 res.qrc 文件编辑模式(如果关闭了,可以右键这个文件点击选择“Open in Editor”),为了方便分类管理文件,我们可以使用 Add Prefix 功能为资源文件添加前缀,前缀的格式应该为类似文件系统中的路径格式,例如 /images。

在这里插入图片描述为了确保路径正确,前缀中的 / 是必需的,它在资源文件引用时是路径分隔符,起到类似 Linux 下根节点的作用,我们现在第⑪处添加了前缀/。

在这里插入图片描述添加了前缀后,我们添加资源图片,放在/images 前缀的下面。这里我们导入在本项目路径 images 文件夹中的3张图片,添加完成需要按“Ctrl + S”保存 res.qrc 才会看到左边的结果。添加完成如下图。

在这里插入图片描述

6.3.2 添加 qss 文件

QSS 文件是使用 Qt 程序相关联的样式表文件。它由 GUI 元素的外观和感觉,包括布局,颜色,鼠标的行为,大小和字体。它的风格,一个可以合并到一个 UI(用户界面)。与 HTML 的 CSS 类似,Qt 的样式表是纯文本的格式定义,在应用程序运行时可以载入和解析这些样式定义,从而使应用程序的界面呈现不同的效果。
在这里插入图片描述如上图加入一个空白文件,新建的文件名 style.qss 文件,如下图,默认添加到项目的路径下,后面步骤采用默认,直至完成。
在这里插入图片描述编辑style.qss,保存,最后完成的项目如下图所示:

在这里插入图片描述第 10 行、第 13 行,第16行,设置 QCheckBox 的 indicator 的背景图片。这样当它们点击切换时就
会看到 QCheckBox 的三种选择状态了。

style.qss文件内容(方便拷贝):

QCheckBox{
spacing: 5px;
color: white;
}
QCheckBox::indicator {
width: 50px;
height: 50px;
}
QCheckBox::indicator:enabled:unchecked {
image: url(:/images/unchecked.png);
}
QCheckBox::indicator:enabled:checked {
image: url(:/images/checked.png);
}
QCheckBox::indicator:enabled:indeterminate {
image: url(:/images/indeterminate.png);
}

6.4 完成代码编辑

6.4.1 修改项目文件 _radiobutton.pro

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.h# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetRESOURCES += \res.qrc# 根据使用的 Qt 版本设置编译条件
greaterThan(QT_MAJOR_VERSION, 4) {# 如果使用的是 Qt 5 或者更新版本message("使用的是 Qt 5版本")} else {# 如果使用的是 Qt 4 或者更早的版本message("使用的是 Qt 4版本")DEFINES += QT_ARM_PLATFORMQMAKE_CXXFLAGS += -std=c++11QMAKE_CXXFLAGS += -Wno-psabi -Wno-deprecated-declarationsLIBS += -lts
}

上面的代码后半段,在系统生成的项目文件中使用条件编译增加目标为qt4-arm时的代码。

6.4.2 修改 main.cpp

1 	#include "widget.h"
2 
3 	#include <QApplication>
4 
5 	#ifdef QT_ARM_PLATFORM
6 	#include <QTextCodec>
7 	#endif
8 
9 	/* 引入 QFile */
10	#include <QFile>
11
12	int main(int argc, char *argv[])
13	{
14		QApplication a(argc, argv);
15
16	#ifdef QT_ARM_PLATFORM
17		//解决Qt4中文乱码
18		QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
19		QTextCodec::setCodecForTr(QTextCodec::codecForName("system"));    //若英文系统,则用GBK
20		QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
21		QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
22	#endif
23
24		/* 指定文件 */
25	   QFile file(":/style.qss");
26
27		/* 判断文件是否存在 */
28		if (file.exists() ) {
29		/* 以只读的方式打开 */
30		file.open(QFile::ReadOnly);
31		/* 以字符串的方式保存读出的结果 */
32		QString styleSheet = QLatin1String(file.readAll());
33		/* 设置全局样式 */
34		qApp->setStyleSheet(styleSheet);
35		/* 关闭文件 */
36		file.close();
37		}
38
39		Widget w;
40		w.show();
41		return a.exec();
42	}
  • 为了解决当程序运行在arm架构系统时,中文显示文乱码问题,根据从.pro获得的宏QT_ARM_PLATFORM作为编译条件,判断如果系统运行在arm架构,则程序包含文本字符串转换,解决Qt4中文乱码问题。

  • 第 24 行至 37 行,读取 style.qss 的内容。并设置全局样式。

6.4.3 修改 widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QCheckBox>
#include <QButtonGroup>
#include <QLabel>
#include <QHBoxLayout>
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:QCheckBox *tristateCheckbox;QCheckBox *multiSelectCheckbox1;QCheckBox *multiSelectCheckbox2;QButtonGroup *multiSelectButtonGroup;QLabel *label1;QLabel *label2;QHBoxLayout *layout1;QHBoxLayout *layout2;QVBoxLayout *layout;void createTristateCheckbox();void createMultiSelectCheckboxes();private slots:void connectSignalsAndSlots();void tristateCheckboxChanged(int);void onButtonClicked(int id);void multiSelectCheckboxChanged(int id, bool checked);
};
#endif // WIDGET_H

6.4.4 修改 widget.cpp

#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent)
{/* 主窗体设置位置和显示的大小及背景颜色 */this->setGeometry(0, 0, 800, 480);/*将主窗口背景色设置为天蓝色(不透明度为 100%)*/this->setStyleSheet("Widget {background-color: rgba(135, 206, 235, 100%);}");/* 实例化对象 */createTristateCheckbox();createMultiSelectCheckboxes();layout1 = new QHBoxLayout;layout2 = new QHBoxLayout;layout = new QVBoxLayout;layout1->addWidget(label1);layout1->addWidget(tristateCheckbox);layout2->addWidget(label2);layout2->addWidget(multiSelectCheckbox1);layout2->addWidget(multiSelectCheckbox2);layout->addLayout(layout1);layout->addLayout(layout2);setLayout(layout);connectSignalsAndSlots();setWindowTitle("_qcheckbox Example");}Widget::~Widget()
{
}void Widget::createTristateCheckbox()
{tristateCheckbox = new QCheckBox("三态复选框:半选中", this);tristateCheckbox->setTristate(true);tristateCheckbox->setCheckState(Qt::PartiallyChecked);tristateCheckbox->setTristate(true);label1 = new QLabel(this);label1->setText("          第一组:");}void Widget::createMultiSelectCheckboxes()
{multiSelectCheckbox1 = new QCheckBox("多选框1:选中", this);multiSelectCheckbox2 = new QCheckBox("多选框2:未选中", this);multiSelectCheckbox1->setCheckState(Qt::Checked);multiSelectCheckbox2->setCheckState(Qt::Unchecked);multiSelectButtonGroup = new QButtonGroup(this);multiSelectButtonGroup->addButton(multiSelectCheckbox1);multiSelectButtonGroup->addButton(multiSelectCheckbox2);multiSelectButtonGroup->setExclusive(false);//多选label2 = new QLabel(this);label2->setText("          第二组:");}
void Widget::connectSignalsAndSlots()
{connect(tristateCheckbox, SIGNAL(stateChanged(int)), this, SLOT(tristateCheckboxChanged(int)));#ifdef QT_ARM_PLATFORMconnect(multiSelectButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(onButtonClicked(int)));//Qt4
#elseconnect(multiSelectButtonGroup, SIGNAL(buttonToggled(int,bool)), this, SLOT(multiSelectCheckboxChanged(int,bool)));//Qt5#endif}void Widget::tristateCheckboxChanged(int state)
{qDebug() << "三态复选框状态:" << state;/* 判断checkBox的state状态,设置checkBox的文本 */switch (state) {case Qt::Checked:/* 选中状态 */tristateCheckbox->setText("三态复选框:选中");break;case Qt::Unchecked:/* 未选中状态 */tristateCheckbox->setText("三态复选框:未选中");break;case Qt::PartiallyChecked:/* 半选状态 */tristateCheckbox->setText("三态复选框:半选中");break;default:break;}}void Widget::onButtonClicked(int id)//Qt4
{QCheckBox *checkbox = qobject_cast<QCheckBox *>(multiSelectButtonGroup->button(id));int checked = checkbox->isChecked();qDebug() << "多选框" << id + 1 << " 的状态是 " << checked;if(checkbox==multiSelectCheckbox1){if (checked) {/* 选中状态 */multiSelectCheckbox1->setText("多选框1:选中");qDebug() << checkbox->text() << "is checked.";} else {multiSelectCheckbox1->setText("多选框1:未选中");qDebug() << checkbox->text() << "is unchecked.";}}else{if (checked) {/* 选中状态 */multiSelectCheckbox2->setText("多选框2:选中");qDebug() << checkbox->text() << "is checked.";} else {multiSelectCheckbox2->setText("多选框2:未选中");qDebug() << checkbox->text() << "is unchecked.";}}
}void Widget::multiSelectCheckboxChanged(int id, bool checked)//Qt5
{QCheckBox *checkbox = qobject_cast<QCheckBox *>(multiSelectButtonGroup->button(id));qDebug() << "多选框 " << id + 1 << " 的状态是 " << checked;if(checkbox==multiSelectCheckbox1){if (checked) {/* 选中状态 */multiSelectCheckbox1->setText("多选框1:选中");qDebug() << checkbox->text() << "is checked.";} else {multiSelectCheckbox1->setText("多选框1:未选中");qDebug() << checkbox->text() << "is unchecked.";}}else{if (checked) {/* 选中状态 */multiSelectCheckbox2->setText("多选框2:选中");qDebug() << checkbox->text() << "is checked.";} else {multiSelectCheckbox2->setText("多选框2:未选中");qDebug() << checkbox->text() << "is unchecked.";}}}

6.5 切换Kit,获得运行在不同系统中的运行的执行文件

点击窗口左边的Debug,可以选择编译运行在不同平台上的可执行文件,arm-v7为arm架构的设备,使用Qt4库,而桌面则是当前ubuntu系统,使用Qt5。
Qt5编译完成的可执行程序_qcheckbox,存放在项目目录的build-_qcheckbox-unknown-Debug/文件夹下,Qt4编译完成的可执行程序_qcheckbox,存放在项目目录的build-_qcheckbox-arm_v7-Debug/文件夹下。

6.6 程序中的qt机制

6.6.1 QButtonGroupbuttonToggledbuttonClicked信号

QButtonGroup 是一个辅助类,主要用于创建互斥或多选的逻辑按钮组。可以将一组单选按钮或复选框等逻辑相关的按钮放在同一个 QButtonGroup 对象中,并设置该组为互斥或多选。当该组中选择某个按钮时,其他按钮会自动按照设置改变或不改变。
buttonToggled信号是 Qt5 为QButtonGroup 类增加的一个信号,以便更好地支持多选按钮组(multi-selection button group)。在Qt5中,buttonToggled 信号会返回两个参数:选中的按钮对应的QAbstractButton*指针和其新的选中状态checked。这使基于多状态(如三态复选框)或分组(多个单选按钮)的动作变得更加简单。
在 Qt4 中,QButtonGroup 没有 buttonToggled 信号,只能使用buttonClicked信号来检测组中按钮的状态更改。
在我们上面的程序中,使用条件编译体现了Qt4和Qt5编程的不同:

#ifdef QT_ARM_PLATFORMconnect(multiSelectButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(onButtonClicked(int)));
#elseconnect(multiSelectButtonGroup, SIGNAL(buttonToggled(int,bool)), this, SLOT(multiSelectCheckboxChanged(int,bool)));#endif

6.6.2 QAbstractButton 类

QAbstractButton 类是 Qt 按钮相关类的基类,它是一个抽象类,也就是说无法直接实例化。QAbstractButton 提供了一些共性的概念和方法,具有以下作用:

  • 按钮状态控制:维护按钮的不同状态,如正常、选中和按下等状态。
  • 选中控制:用于实现单选和多选等功能。
  • 内置图像控制:按钮可以包含或显示图像、标签。
  • 信号和槽机制:发射信号以响应用户输入或响应代码变化等。
  • 焦点控制:按钮可以接受键盘输入的焦点,并根据用户输入的快捷键来激活信号。
    如果我们需要自定义一种新的按钮,一般可以继承 QAbstractButton 类,并实现一些虚函数,以便根据实际需要提供更丰富的功能。
    QAbstractButton 类在 Qt5 中相比 Qt4,最主要的改进就是引入了一组新的虚函数用于事件处理和样式表适配等方面的扩展。

总结

本文介绍QT常用控件的第四个按钮,QCheckBox 按钮编程。通过这个例子,进一步巩固QT管理资源机制知识和使用样式表进行外观设置;学习QCheckBox 复选框的三态功能和如何使用 QButtonGroup分组管理QCheckBox 复选框 ,演示了如何在一个组内实现按钮的多选。文章中使用的例程和内容都是在chatgpt的帮助下完成的,并分别在ubuntu22.04系统(Qt5)和 ARM架构设备中亲测有效。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python按键控制灯:简单易用的物联网解决方案

Python按键控制灯&#xff1a;简单易用的物联网解决方案 随着物联网技术的快速发展&#xff0c;人们对智能家居的需求也越来越高。本文将介绍如何使用Python按键控制灯&#xff0c;轻松实现家居自动化控制&#xff0c;为您的生活带来方便与舒适。 Python语言简介 Python是一…

chatgpt赋能python:Python中按下某个按键的实现方法

Python中按下某个按键的实现方法 Python是一种广泛应用于各种领域的高级编程语言&#xff0c;可以用于编写各种类型的应用程序和工具。其中&#xff0c;它在游戏开发方面有着广泛的应用。而在游戏开发过程中&#xff0c;按键响应是至关重要的一个组成部分。本文将带领读者了解…

chatgpt赋能python:Python校验用户按键的方法

Python校验用户按键的方法 在Python编程中&#xff0c;我们有时需要校验用户按键的输入。这对于需要用户输入特定字符或按键组合的程序来说是非常必要的。本文将介绍一些Python校验用户按键的方法。 使用getch()函数 Python的getch()函数可以用于校验用户的按键输入。这个函…

chatgpt赋能python:Python编程中的按键事件

Python编程中的按键事件 在Python编程中&#xff0c;按键事件是一项非常有用的功能。通过监控按下键盘中的特定键&#xff0c;您可以触发程序的某些特定操作&#xff0c;这些操作可用于增强应用程序的功能和用户体验。 按键事件的基本工作原理 Python中的按键事件基于图形用…

网站日志蜘蛛在线分析工具源码 日志可视化管理工具源码 快速分析搜索引擎网络爬虫抓取记录

简介&#xff1a; 网站日志蜘蛛在线分析工具源码 日志可视化管理工具源码 快速分析搜索引擎网络爬虫抓取记录 如果是 linux 宝塔面板 的服务器自然环境&#xff0c;大家登陆宝塔面板linux控制面板后&#xff0c;点一下左边“文件”&#xff0c;在www下的wwwlogs文件目录中就能…

如何用ChatGPT做品牌项目的二手信息搜集?

该场景对应的关键词库&#xff08;25个&#xff09;&#xff1a; 品牌案例、竞品、信息来源、项目分析、官方渠道、品类、品牌、节日节庆、明星、国家、奖项、代理商、项目名称、项目描述、品牌介绍、竞争情况、运营数据、财务信息、交易信息、法律问题、网络平台、行业人士、品…

金山办公的WPS AI将引入大模型能力(LLM)到表格、文字、演示和PDF四大组件

&#x1f680; 金山办公的WPS AI将引入大模型能力&#xff08;LLM&#xff09;到表格、文字、演示和PDF四大组件&#xff0c;并支持桌面电脑和移动设备。 金山办公的WPS AI将引入大模型能力&#xff08;LLM&#xff09;到表格、文字、演示和PDF四大组件&#xff0c;并支持桌面…

系统内的在线协同富文本,如何寻求解决方案?

如果只是普通的富文本编辑&#xff0c;前端市面上已经有成熟的解决方案&#xff0c; 来自国产的富文本编辑器&#xff0c;开源 Web 富文本编辑器&#xff0c;开箱即用&#xff0c;配置简单。支持 JS Vue React 。 GitHub - wangeditor-team/wangEditor: wangEditor —— 开源…

WPS Office AI 开放内测,名额有限,先到先到

没等来Microsoft 365 Copilot&#xff0c;等来了 WPS AI&#xff0c;作为国内第一款集成多类AI功能的日常办公多件套应用&#xff0c;真是广大用户的福音。内测申请入口已经放开了&#xff0c;想一睹风采且想让自己的Office灵动起来的&#xff0c;抓紧行动&#xff08;文末获取…

WPS Office AI实战:AI带来的文档智能化体验

前面我们已经了解过 AI 在PPT制作、Word写作方面带来的革命性效率提供&#xff0c;今天一起来聊聊在线文档的AI应用。如果你习惯用在线文档的话&#xff0c;一样也可以享受到AI的强大优势。金山在线智能云文档已经接入WPS Office AI套件大家庭&#xff0c;用AI来改造写作的新时…

不用等微软了!实测:全线接入AI的WPS,做PPT就是一句话的事

金磊 梦晨 发自 凹非寺量子位 | 公众号 QbitAI 要问现在办公、学习最最最fashion的姿势是什么&#xff1f; 那必然是跟AI来一个深度合体。 例如老板丢过来一份纸质合同&#xff08;还是全英文的&#xff09;&#xff0c;让你快速浏览并做总结。 此时不必惊慌&#xff0c;遇事掏…

与ChatGPT 技术对话 42 天后,30多岁男子过于焦虑自杀身亡...

点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 来自&#xff1a;极目新闻 最近ChatGPT的飞速发展引起了世界范围的广泛关注&#xff0c;有人兴奋&#xff0c;也有人担忧。 据比利时媒体LAvenir3月28日报道&#xff0c;一名热衷于环境问题的比利时男子…

影刀知识点总结

判断字符串之间的包含关系&#xff0c;用if条件就可以。影刀社区&#xff1a;https://www.winrobot360.com/community/homePage启动excel的意思是&#xff0c;如果没有打开&#xff0c;就打开&#xff0c;如果打开了&#xff0c;就激活已打开的excel&#xff0c;输入内容&#…

影刀Rpa 、英佑科技面试总结

文章目录 1、dubbo spi 都使用过哪些? Java Spi 的缺点有哪些?2、dubbo的负载均衡策略有哪些3、设计一个rpc,有哪些模块4、Dubbo注册中心有哪些5、apollo框架,如何保证容错6、List线程安全实现方式有哪些?7、mysql 索引& 优化CSDN话题挑战赛第2期 参赛话题: 面试宝典…

day13- 影刀的基本操作

day13- 影刀的基本操作 影刀 - rpa软件开发工具(开发软件机器人) 软件机器人: 代替人类控制计算机完成流程固定且大量重复的作用 01搭建网页机器人 主流程 常见标签的控制方法 分支和循环 获取当前选中网页 变量和循环

影刀学习抓取网页详情

学习目标&#xff1a;影刀学习 1.爬取网页详情&#xff1a;点击网页&#xff0c;循环设置&#xff0c;点击其中一个超链接&#xff0c;进入超链接内容&#xff0c;点击其中一个超链接&#xff0c;获取里面的信息&#xff0c;写入表格&#xff0c;关闭网页。 2.在1的基础上&a…

huike汇客CRM项目实战-并肩作战

任务目录&#xff1a; 任务一&#xff1a;添加线索跟进记录 任务二&#xff1a;查询线索跟进记录列表 任务三&#xff1a;添加商机跟进记录 任务四&#xff1a;查询商机跟进记录列表 任务一&#xff1a;新增线索跟进记录 实体类&#xff1a; Data public class TableDataInfo i…

CSDN分类专栏操作演示

专栏没有消失&#xff01; CSDN仍然保留专栏功能&#xff0c;与分类功能合并&#xff0c;改名为分类专栏。文章目录 分类专栏的入口分类专栏的功能演示如何新建一个二级分类专栏如何快速编辑分类专栏名称在哪管理分类专栏内的文章如何编辑分类专栏内的单篇文章如何对分类专栏内…

重复造轮子的百模大战:两极热,中间空

文&#xff5c;光锥智能&#xff0c;作者&#xff5c;周文斌&#xff0c;编辑&#xff5c;王一粟 “不敢下手&#xff0c;现在中国还没跑出来一家绝对有优势的大模型&#xff0c;上层应用没法投&#xff0c;担心押错宝。”投资人Jucy&#xff08;化名&#xff09;向光锥智能表…

“腰部”大模型,活在故事里

撰文 | 文烨豪 编辑 | 吴先之 AIGC浪潮下&#xff0c;“模”力正在席卷科技语境。 百度、阿里等巨头们接连出牌的同时&#xff0c;体量略逊一筹的知乎、小红书、云从科技等玩家&#xff0c;亦试图挤进赛道——大模型的牌桌&#xff0c;正变得愈发拥挤。 当下的千模、万模大战…