「Qt Widget中文示例指南」如何创建一个计算器?(二)

2023-12-04

Qt >https://www.evget.com/product/3579 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

本文将展示如何使用信号和槽来实现计算器小部件的功能,以及如何使用QGridLayout在网格中放置子小部件。在上文中( 点击这里回顾>> >https://www.evget.com/article/2023/11/20/48135.html )为大家介绍了实现计算器的Calculator类定义,本文将主要介绍Calculator类是如何实现的,持续关注我们哦~

点击获取Qt Widget组件下载 >https://www.evget.com/vendor/495 (Q技术交流:166830288)

Qt Widget中文示例指南图集

计算器示例的屏幕截图

这个例子由两个类组成:

  • Calculator是计算器小部件,具有计算器的所有功能。
  • Button是用于每个计算器按钮的小部件,它派生自QToolButton。

我们将从回顾计算器开始,然后再看看按钮。

Calculator类实现
Calculator::Calculator(QWidget *parent)
: QWidget(parent), sumInMemory(0.0), sumSoFar(0.0)
, factorSoFar(0.0), waitingForOperand(true)
{

在构造函数中,初始化计算器的状态。pendingAdditiveOperator和pendingMultiplicativeOperator变量不需要显式初始化,因为 QString >https://doc.qt.io/qt-6/qstring.html 构造函数将它们初始化为空字符串。也可以直接在header文件中初始化这些变量,这称为成员初始化,避免了长初始化列表。

display = new QLineEdit("0");
display->setReadOnly(true);
display->setAlignment(Qt::AlignRight);
display->setMaxLength(15);

QFont font = display->font();
font.setPointSize(font.pointSize() + 8);
display->setFont(font);

我们创建了表示计算器显示的 QLineEdit >https://doc.qt.io/qt-6/qlineedit.html ,并设置了它的一些属性,特别地我们将其设置为只读。

我们还将显示器的字体放大了8个点。

for (int i = 0; i < NumDigitButtons; ++i)
digitButtons[i] = createButton(QString::number(i), &Calculator::digitClicked);

Button *pointButton = createButton(tr("."), &Calculator::pointClicked);
Button *changeSignButton = createButton(tr("\302\261"), &Calculator::changeSignClicked);

Button *backspaceButton = createButton(tr("Backspace"), &Calculator::backspaceClicked);
Button *clearButton = createButton(tr("Clear"), &Calculator::clear);
Button *clearAllButton = createButton(tr("Clear All"), &Calculator::clearAll);

Button *clearMemoryButton = createButton(tr("MC"), &Calculator::clearMemory);
Button *readMemoryButton = createButton(tr("MR"), &Calculator::readMemory);
Button *setMemoryButton = createButton(tr("MS"), &Calculator::setMemory);
Button *addToMemoryButton = createButton(tr("M+"), &Calculator::addToMemory);

Button *divisionButton = createButton(tr("\303\267"), &Calculator::multiplicativeOperatorClicked);
Button *timesButton = createButton(tr("\303\227"), &Calculator::multiplicativeOperatorClicked);
Button *minusButton = createButton(tr("-"), &Calculator::additiveOperatorClicked);
Button *plusButton = createButton(tr("+"), &Calculator::additiveOperatorClicked);

Button *squareRootButton = createButton(tr("Sqrt"), &Calculator::unaryOperatorClicked);
Button *powerButton = createButton(tr("x\302\262"), &Calculator::unaryOperatorClicked);
Button *reciprocalButton = createButton(tr("1/x"), &Calculator::unaryOperatorClicked);
Button *equalButton = createButton(tr("="), &Calculator::equalClicked);

对于每个按钮,我们使用适当的文本标签和连接到按钮的插槽调用私有createButton()函数。

QGridLayout *mainLayout = new QGridLayout;
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
mainLayout->addWidget(display, 0, 0, 1, 6);
mainLayout->addWidget(backspaceButton, 1, 0, 1, 2);
mainLayout->addWidget(clearButton, 1, 2, 1, 2);
mainLayout->addWidget(clearAllButton, 1, 4, 1, 2);

mainLayout->addWidget(clearMemoryButton, 2, 0);
mainLayout->addWidget(readMemoryButton, 3, 0);
mainLayout->addWidget(setMemoryButton, 4, 0);
mainLayout->addWidget(addToMemoryButton, 5, 0);

for (int i = 1; i < NumDigitButtons; ++i) {
int row = ((9 - i) / 3) + 2;
int column = ((i - 1) % 3) + 1;
mainLayout->addWidget(digitButtons[i], row, column);
}

mainLayout->addWidget(digitButtons[0], 5, 1);
mainLayout->addWidget(pointButton, 5, 2);
mainLayout->addWidget(changeSignButton, 5, 3);

mainLayout->addWidget(divisionButton, 2, 4);
mainLayout->addWidget(timesButton, 3, 4);
mainLayout->addWidget(minusButton, 4, 4);
mainLayout->addWidget(plusButton, 5, 4);

mainLayout->addWidget(squareRootButton, 2, 5);
mainLayout->addWidget(powerButton, 3, 5);
mainLayout->addWidget(reciprocalButton, 4, 5);
mainLayout->addWidget(equalButton, 5, 5);
setLayout(mainLayout);

setWindowTitle(tr("Calculator"));
}

布局由单个 QGridLayout >https://doc.qt.io/qt-6/qgridlayout.html 处理, QLayout::setSizeConstraint >https://doc.qt.io/qt-6/qlayout.html#sizeConstraint-prop ()调用确保Calculator小部件始终显示为其最佳大小(其大小提示),从而防止用户调整计算器的大小,大小提示由子小部件的大小和大小策略决定。

大多数子部件只占用网格布局中的一个单元格,对于这些我们只需要将一行和一列传递给QGridLayout::addWidget()。display、backspaceButton、clearButton和clearAllButton小部件占用多于一列,对于这些我们还必须船体一个行空间和一个列空间。

void Calculator::digitClicked()
{
Button *clickedButton = qobject_cast<Button *>(sender());
int digitValue = clickedButton->text().toInt();
if (display->text() == "0" && digitValue == 0.0)
return;

if (waitingForOperand) {
display->clear();
waitingForOperand = false;
}
display->setText(display->text() + QString::number(digitValue));
}

按下计算器的数字按钮时将发出按钮的clicked()信号,该信号将触发digitClicked()插槽。

首先我们先使用 QObject::sender >https://doc.qt.io/qt-6/qobject.html#sender ()找出哪个按钮发送了信号,这个函数以QObject指针的形式返回发送方。因为我们知道发送方是一个Button对象,所以可以安全地强制转换 QObject >https://doc.qt.io/qt-6/qobject.html 。本来可以使用C风格的强制转换或c++ static_cast<>(),但作为一种防御性编程技术,我们使用 qobject_cast >https://doc.qt.io/qt-6/qobject.html#qobject_cast-1 ()。这样做的好处是,如果对象的类型错误,则返回空指针。空指针导致的崩溃比不安全强制转换导致的崩溃更容易诊断。有了按钮后,我们使用QToolButton::text()提取操作符。

插槽需要特别考虑两种情况,如果显示包含“0”,而用户点击了“0”按钮,那么显示“00”将是愚蠢的。如果计算器处于等待新操作数的状态,新数字就是新操作数的第一位;在这种情况下,必须首先清除先前计算的任何结果。

最后,我们将新数字附加到显示的值后面。

void Calculator::unaryOperatorClicked()
{
Button *clickedButton = qobject_cast<Button *>(sender());
QString clickedOperator = clickedButton->text();
double operand = display->text().toDouble();
double result = 0.0;

if (clickedOperator == tr("Sqrt")) {
if (operand < 0.0) {
abortOperation();
return;
}
result = std::sqrt(operand);
} else if (clickedOperator == tr("x\302\262")) {
result = std::pow(operand, 2.0);
} else if (clickedOperator == tr("1/x")) {
if (operand == 0.0) {
abortOperation();
return;
}
result = 1.0 / operand;
}
display->setText(QString::number(result));
waitingForOperand = true;
}

每当单击一个一元操作符按钮时,就调用unaryOperatorClicked()插槽,再次使用QObject::sender()获取指向被单击按钮的指针。操作符从按钮的文本中提取并存储在clickoperator中,操作数从display中获得。

然后我们执行这个操作,如果Sqrt应用于负数或1/x到零,调用abortOperation()。如果一切顺利,我们将在行编辑中显示操作的结果,并将waitingForOperand设置为true。这确保了如果用户键入一个新数字,该数字将被视为一个新的操作数,而不是附加到当前值。

void Calculator::additiveOperatorClicked()
{
Button *clickedButton = qobject_cast<Button *>(sender());
if (!clickedButton)
return;
QString clickedOperator = clickedButton->text();
double operand = display->text().toDouble();

当用户单击+或-按钮时调用additiveOperatorClicked()槽。

在对单击的操作符进行实际操作之前,我们必须处理所有挂起的操作。从乘法运算符开始,因为它们的优先级高于加法运算符:

if (!pendingMultiplicativeOperator.isEmpty()) {
if (!calculate(operand, pendingMultiplicativeOperator)) {
abortOperation();
return;
}
display->setText(QString::number(factorSoFar));
operand = factorSoFar;
factorSoFar = 0.0;
pendingMultiplicativeOperator.clear();
}

如果之前已经单击了x或÷,而没有随后单击=,则显示中的当前值是x或÷操作符的右操作数,我们最终可以执行该操作并更新显示。

if (!pendingAdditiveOperator.isEmpty()) {
if (!calculate(operand, pendingAdditiveOperator)) {
abortOperation();
return;
}
display->setText(QString::number(sumSoFar));
} else {
sumSoFar = operand;
}

如果前面已经单击了+或-,则sumSoFar是左操作数,而显示的当前值是操作符的右操作数。如果没有挂起的加法运算符,则简单地将sumSoFar设置为显示中的文本。

pendingAdditiveOperator = clickedOperator;
waitingForOperand = true;
}

最后,我们可以处理刚刚点击的操作符。由于还没有右操作数,所以将单击的操作符存储在pendingAdditiveOperator变量中。稍后当有一个右操作数,而左操作数为sumSoFar时,将应用该操作。

void Calculator::multiplicativeOperatorClicked()
{
Button *clickedButton = qobject_cast<Button *>(sender());
if (!clickedButton)
return;
QString clickedOperator = clickedButton->text();
double operand = display->text().toDouble();

if (!pendingMultiplicativeOperator.isEmpty()) {
if (!calculate(operand, pendingMultiplicativeOperator)) {
abortOperation();
return;
}
display->setText(QString::number(factorSoFar));
} else {
factorSoFar = operand;
}

pendingMultiplicativeOperator = clickedOperator;
waitingForOperand = true;
}

multiplicativeOperatorClicked()插槽类似于additiveOperatorClicked(),不需要担心挂起的加法运算符,因为乘法运算符优先于加法运算符。

void Calculator::equalClicked()
{
double operand = display->text().toDouble();

if (!pendingMultiplicativeOperator.isEmpty()) {
if (!calculate(operand, pendingMultiplicativeOperator)) {
abortOperation();
return;
}
operand = factorSoFar;
factorSoFar = 0.0;
pendingMultiplicativeOperator.clear();
}
if (!pendingAdditiveOperator.isEmpty()) {
if (!calculate(operand, pendingAdditiveOperator)) {
abortOperation();
return;
}
pendingAdditiveOperator.clear();
} else {
sumSoFar = operand;
}

display->setText(QString::number(sumSoFar));
sumSoFar = 0.0;
waitingForOperand = true;
}

与additiveOperatorClicked()一样,我们首先处理任何挂起的乘法和加法操作符,然后显示sumSoFar并将变量重置为零。必须将变量重置为零,以避免对值进行两次计数。

void Calculator::pointClicked()
{
if (waitingForOperand)
display->setText("0");
if (!display->text().contains('.'))
display->setText(display->text() + tr("."));
waitingForOperand = false;
}

pointClicked()槽向显示的内容添加一个小数点。

void Calculator::changeSignClicked()
{
QString text = display->text();
double value = text.toDouble();

if (value > 0.0) {
text.prepend(tr("-"));
} else if (value < 0.0) {
text.remove(0, 1);
}
display->setText(text);
}

changeSignClicked()槽改变显示值的符号,如果当前值为正,则在前面加一个负号;如果当前值为负,则从值中删除第一个字符(负号)。

void Calculator::backspaceClicked()
{
if (waitingForOperand)
return;

QString text = display->text();
text.chop(1);
if (text.isEmpty()) {
text = "0";
waitingForOperand = true;
}
display->setText(text);
}

backspaceclick()将删除显示中最右边的字符,如果得到一个空字符串,则显示“0”并将waitingForOperand设置为true。

void Calculator::clear()
{
if (waitingForOperand)
return;

display->setText("0");
waitingForOperand = true;
}

clear()槽将当前操作数重置为零,这相当于按退格键多次擦除整个操作数。

void Calculator::clearAll()
{
sumSoFar = 0.0;
factorSoFar = 0.0;
pendingAdditiveOperator.clear();
pendingMultiplicativeOperator.clear();
display->setText("0");
waitingForOperand = true;
}

clearAll()槽将计算器重置为初始状态。

void Calculator::clearMemory()
{
sumInMemory = 0.0;
}

void Calculator::readMemory()
{
display->setText(QString::number(sumInMemory));
waitingForOperand = true;
}

void Calculator::setMemory()
{
equalClicked();
sumInMemory = display->text().toDouble();
}

void Calculator::addToMemory()
{
equalClicked();
sumInMemory += display->text().toDouble();
}

clearMemory()插槽擦除保存在内存中的总和,readMemory()将总和显示为操作数,setMemory()将内存中的总和替换为当前的总和,addtommemory()将当前值添加到内存中的值。对于setMemory()和addtommemory(),我们首先调用equalClicked()来更新sumSoFar和显示中的值。

template<typename PointerToMemberFunction>
Button *Calculator::createButton(const QString &text, const PointerToMemberFunction &member)
{
Button *button = new Button(text);
connect(button, &Button::clicked, this, member);
return button;
}

私有的createButton()函数从构造函数中被调用来创建计算器按钮。

void Calculator::abortOperation()
{
clearAll();
display->setText(tr("####"));
}

私有的abortOperation()函数在计算失败时被调用,重置计算器状态,显示“####”。

bool Calculator::calculate(double rightOperand, const QString &pendingOperator)
{
if (pendingOperator == tr("+")) {
sumSoFar += rightOperand;
} else if (pendingOperator == tr("-")) {
sumSoFar -= rightOperand;
} else if (pendingOperator == tr("\303\227")) {
factorSoFar *= rightOperand;
} else if (pendingOperator == tr("\303\267")) {
if (rightOperand == 0.0)
return false;
factorSoFar /= rightOperand;
}
return true;
}

私有的calculate()函数执行一个二进制操作,右操作数由rightOperand给出。对于加法操作符,左操作数为sumSoFar;对于乘法运算符,左操作数是factorSoFar。如果发生除零,函数返回false。

Qt Widget组件推荐
  • QtitanRibbon >https://www.evget.com/product/3494 - Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart >https://www.evget.com/product/3495 - Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
  • QtitanDataGrid >https://www.evget.com/product/3493/download - Qt网格组件:提供了一套完整的标准 QTableView 函数和传统组件无法实现的独特功能。使您能够将不同来源的各类数据加载到一个快速、灵活且功能强大的可编辑网格中,支持排序、分组、报告、创建带状列、拖放按钮和许多其他方便的功能。
  • QtitanDocking >https://www.evget.com/product/3998 :允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

「Qt Widget中文示例指南」如何创建一个计算器?(二) 的相关文章

  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 【计算机毕业设计】红色革命文物征集管理系统

    红色革命文物征集管理系统 传统办法管理信息首先需要花费的时间比较多 其次数据出错率比较高 而且对错误的数据进行更改也比较困难 最后 检索数据费事费力 因此 在计算机上安装红色革命文物征集管理系统软件来发挥其高效地信息处理的作用 可以规范信息
  • 【计算机毕业设计】私房菜定制上门服务系统

    私房菜定制上门服务系统 如今社会上各行各业 都喜欢用自己行业的专属软件工作 互联网发展到这个时候 人们已经发现离不开了互联网 新技术的产生 往往能解决一些老技术的弊端问题 因为传统私房菜定制上门服务系统信息管理难度大 容错率低 管理人员处理
  • 光伏储能单相逆变器并网仿真模型(Simulink仿真实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Simulink仿真实现
  • 【计算机毕业设计】视频点播系统

    视频点播系统 传统办法管理信息首先需要花费的时间比较多 其次数据出错率比较高 而且对错误的数据进行更改也比较困难 最后 检索数据费事费力 因此 在计算机上安装视频点播系统软件来发挥其高效地信息处理的作用 可以规范信息管理流程 让管理工作可以
  • 【计算机毕业设计】可信捐赠系统

    可信捐赠系统 如今社会上各行各业 都喜欢用自己行业的专属软件工作 互联网发展到这个时候 人们已经发现离不开了互联网 新技术的产生 往往能解决一些老技术的弊端问题 因为传统可信捐赠系统信息管理难度大 容错率低 管理人员处理数据费工费时 所以专
  • 一文讲透Python线程池ThreadPoolExecutor

    01 初识 Python 中已经有了 threading 模块 为什么还需要线程池呢 线程池又是什么东西呢 在介绍线程同步的信号量机制的时候 举得例子是爬虫的例子 需要控制同时爬取的线程数 例子中创建了20个线程 而同时只允许3个线程在运行
  • 【计算机毕业设计】健身房管理系统

    健身房管理系统 传统办法管理信息首先需要花费的时间比较多 其次数据出错率比较高 而且对错误的数据进行更改也比较困难 最后 检索数据费事费力 因此 在计算机上安装健身房管理系统软件来发挥其高效地信息处理的作用 可以规范信息管理流程 让管理工作
  • 扬帆证券:三大项目启动 深圳打造金融科技发展高地

    11月29日 2023深圳国际金融科技节正式拉开帷幕 作为金融科技节的中心板块 2023我国 深圳 金融科技大会也于当日举办 记者从现场了解到 本届大会愈加集合金融科技使用范畴 推出多个 实招 促进金融科技落地使用和探寻打开远景 详细来看
  • JDK7 HashMap

    在Java中HashMap是一个常用且重要的容器 它基于哈希表实现 提供了高效的插入 删除和查找操作 本文我们将分别讲述JDK7中的HashMap 使用 HashMap的使用非常简单 下面演示下存数据与取数据 简单示例 public sta
  • 光伏混合储能并网直流微电网仿真模型(Simulink仿真实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Simulink仿真实现
  • 基于异步电机的光伏储能三相并网微电网仿真模型(Simulink仿真实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Simulink仿真实现
  • 关于软件测试笔试题目

    在学习和工作中 我们经常接触到试题 试题是考核某种技能水平的标准 你知道什么样的试题才是好试题吗 下面小编给大家分享关于软件测试笔试题目内容 希望能够帮助大家 关于软件测试笔试题目 一 判断题 1 软件测试的目的是尽可能多的找出软件的缺陷
  • 在直播间抢到好多实惠东东,全靠抖音支付

    前不久我特别喜欢的一位主播的直播间做活动 很多我放在购物车里好久的心仪好物都有秒杀惊喜价 更让我开心的是 在拼手速抢这些秒杀好物的时候 我都成功了 这主要是因为我用了抖音支付 付款环节特别丝滑顺畅 让我在抖音的购物体验直接原地提升了几个le
  • 坚守合规底线 波场TRON将联合多方不断提升合规水平

    数字化时代 区块链和加密技术因其去中心化 全球化及透明度等优势在金融科技领域备受关注 但与此同时 一些风险事件的发生也暴露了行业合规化缺乏等问题的存在 近期 有媒体报道称 波场TRON或成为少数非法组织尤其是美国认定的恐怖组织融资的工具 对
  • 三相共直流母线式光伏储能VSG仿真模型研究(Simulink仿真实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Simulink仿真实现
  • 数据通信——OSPF路由控制实验

    实验需求 我们采用OSPF完成路由的控制 首先连接如下拓扑 所有设备均属于area 0 网段及环回口配置如上图所示 实验目的 R4和R1的环回口通信路径为R4 R2 R1若R2出现问题 自动切换到R3路径 实验配置 1 配置好各个接口的IP
  • 孙宇晨入选The Giving Block年度加密慈善人物

    日前 全球主流加密捐赠平台The Giving Block公布了2023年度 加密慈善人物 榜单 以表彰过去一年在加密慈善领域做出卓越贡献的个人 其中 波场TRON创始人 火币HTX全球顾问委员会委员孙宇晨因其瞩目的慈善成就入选该榜单 在榜
  • C++ -- 每日选择题 -- Day2

    第一题 1 下面代码中sizeof A 结果为 pragma pack 2 class A int i union U char str 13 int i u void func typedef char cp enum red green
  • 链表高频面试题

    1 两个链表第一个公共子节点 LeetCode160 给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表不存在相交节点 返回 null 图示两个链表在节点 c1 开始相交 listA 4
  • 「Qt Widget中文示例指南」如何创建一个计算器?(二)

    Qt gt https www evget com product 3579 是目前最先进 最完整的跨平台C 开发工具 它不仅完全实现了一次编写 所有平台无差别运行 更提供了几乎所有开发过程中需要用到的工具 如今 Qt已被运用于超过70个行