Qt—帮助系统

2023-11-19

一个完善的应用程序应该提供尽可能丰富的帮助信息。Qt中可以使用工具提示、状态提示以及“What’s This”等简单的帮助提示,也可以使用Qt Assistant来提供强大的在线帮助。

简单的帮助提示

已经讲到了工具提示和状态提示,这里简单介绍“What’s This”帮助提示运行一个对话框窗口时会看到,在标题栏中有一个“?”图标,按下它就会进入“WhatThis”模式,这时如果哪个部件设置了“What’s This”帮助提示,那么当鼠标移动到它面时就会弹出一个悬浮的文本框显示相应的帮助提示。下面来看一个具体例子。
在这里插入图片描述

新建Qt Widgets应用项目名称为mywhatsthis,类名为MainWindow ,基类保持QMainWindow不变。建完项目后,单击 mainwindow.ui文件进入设计模式。

在界面上单击,在弹出的级联多单中选择“改变‘这是什么’"项,则弹出“编辑这是什么”对话框,可以在这里输入文本者添加图片来设置“What’s This”帮助提示。在这里插入图片描述

这里输入“这是主窗口”,然后将文本改红色,最后单击“确定”按钮关闭该对话框。现在运行程序,按下Shift+F1键就可以显示提示信息了。

点击主界面会显示这是主窗口

有时也想添加一个“?”图标进入“What’s This”模式,这可以通过在代码中使用QWhatsThis类来实现。现在进入mainwindow.cpp文件中,先添加头文件#incluc< QWhatsThis>,然后在构造函数中添加如下代码:

  QAction *action = QWhatsThis::createAction(this);
    ui->mainToolBar->addAction(action);

这里使用了QWhatsThis类的 createAction()函数创建了一个“What’s This”图标,然后将它添加到了工具栏中。
在这里插入图片描述

运行程序,按下“What’s This”图标,并在主界面上单击就可以显示提示信息了。

另外,QWhatsThis类还提供了enter WhatsThisMode()来进入“What’s This”模式。要为一个部件提供“What’s This”提示,也可以在代码中通过调用该部件的set WhatsThis()函数来实现。

要进行详细的功能和使用的介绍,则需要提供HTML格式的帮助文本。在程序中可以通过调用Web浏览器或者使用QTextBrowser来管理和应用这些HTML文件。不过,Qt提供了更加强大的工具,那就是Qt Assistant,它支持索引和全文检索,而且可以为多个应用程序同时提供帮助,可以通过定制Qt Assistant来实现强大的在线帮助系统。

定制 Qt Assistant

需要先做些准备:
①创建HTML格式的帮助文档;
②创建Qt帮助项目(Qt help project).qhp文件,该文件是XML格式的,用来组织文档,并且使它们可以在Qt Assistant中使用;
③生成Qt压缩帮助(Qt compressed help).qch文件,该文件由.qhp文件生成,是二进制文件;
④创建Qt帮助集合项目(Qt help collection project).qhcp文件,该文件是XML格式的,用来生成下面的.qhc文件;
⑤生成Qt帮助集合(Qt help collection). qhc文件,该文件是二进制文件,可以使Qt Assistant只显示一个应用程序的帮助文档,也可以定制Qt Assistant的外观和一此功能;
⑥在程序中启动Qt Assistant。

下面通过一个具体例子来讲解整个过程。这里还在前一节程序的基础上进行更改。
第一步,创建HTML格式的帮助文档。可以通过各种编辑器(如MicrosoftWord)来编辑要使用的文档,最后保存为HTML格式的文件。

例如,这里创建了5个HTML文件。然后在项目目录中新建文件夹,命名为documentation,再将这些HTML文件放入其中。
在这里插入图片描述

在documentation文件夹中再新建一个images文件夹,往里面复制一个图标图片,以后将作为Qt Assistant的图标,例如,这里使用了yafeilinux.png图片。
在这里插入图片描述

第二步,创建.qhp文件。首先在 documentation文件夹中创建一个文本文件,然后进行编辑,最后另存为
myHelp.qhp(使用UTF-8编码),注意后缀为.qhp。
在这里插入图片描述

文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<QtHelpProject version="1.0">
  <namespace>yafeilinux.myHelp</namespace>
  <virtualFolder>doc</virtualFolder>
  <filterSection>
    <toc>
      <section title="我的帮助" ref="index.html">
        <section title="关于我们" ref="aboutUs.html">
          <section title="关于yafeilinux" ref="about_yafeilinux.html"></section>
          <section title="关于Qt Creator系列教程" ref="about_QtCreator.html"></section>
        </section>
        <section title="加入我们" ref="joinUs.html"></section>
      </section>
    </toc>
    <keywords>
      <keyword name="关于" ref="aboutUs.html"/>
      <keyword name="yafeilinux" ref="about_yafeilinux.html"/>
      <keyword name="Qt Creator" ref="about_QtCreator.html"/>
    </keywords>
    <files>
      <file>about_QtCreator.html</file>
      <file>aboutUs.html</file>
      <file>about_yafeilinux.html</file>
      <file>index.html</file>
      <file>joinUs.html</file>
      <file>images/*.png</file>
    </files>
  </filterSection>
</QtHelpProject>

这个.qhp文件是XML格式的。

  1. 第一行是XML序言,这里指定了编码encoding为UTF-8;

  2. 第二行指定了QtHelpProject版本为1.0;

  3. 第三行指定了命名空间namespace,每一个.qhp文件的命名空间都必须是唯一的,命名空间会成为Qt Assistant页面 URL的第一部分,这个在后面的内容中会涉及;

  4. 第四行指定了一个虚拟文件夹 virtualFolder,这个文件夹并不需要创建,它只是用来区分文件的;再下面的过滤器部分filterSection标签包含了目录表、索引和所有文档文件的列表。过滤器部分可以设置过滤器属性,这样以后可以在Qt Assistant中通过过滤器来设置文档的显示有否;不过,因为这里只有一个文档,所以不需要Qt Assistant的过滤器功能,这里也就不需要设置过滤器属性。

目录表toc(table of contents)标签中创建了所有HTML文件的目录,指定了它们的标题和对应的路径,这里设定的目录表为:在这里插入图片描述
然后是 keywords标签,它指定了所有索引的关键字和对应的文件,这些关键字会显示在Qt Assistant的索引页面;

在files标签中列出了所有的文件,也包含图片文件。

第三步,生成.qch文件。这里为了测试创建的文件是否可用,可以先生成.qch文件,然后在Qt Assistant中注册它。

这样运行Qt Assistant就会看到添加的文档了。不过,这一步不是必须的。

从开始菜单打开Qt自带的命令行提示符工具(Qt 5.6 forDesktop),然后使用cd命令跳转到项目目录的documentation目录中,分别输入下面的命令后按下回车:

qhelpgenerator myHelp.qhp - o myHelp.qch
assistant -register myHelp.qch

命令行运行结果如图

在这里插入图片描述
命令运行结果如图9-2所示。注册成功,则显示 Documentation successfully reg-istered提示对话框。

这时在开始菜单中启动Qt Assistant(或者直接在命令行输入 assistant来启动Qt Assistant)可以发现,已经出现了我们的 HTML文档,如图9-3所示。在这里插入图片描述
第四步,创建.qhcp 文件。要想使Qt Assistant 只显示我们自己的帮助文档的最简单方法就是生成帮助集合文件,即.qhc 文件,那么首先要创建.qhcp文件。在
documentation文件夹中新建文本文档,并对其进行编辑,最后另存为myHelp.qhcp(使用UTF-8编码),注意后缀为.qhcp。

这里还要创建一个名为about. txt的文本文件,在其中输入一些该帮助的说明信息,作为Qt Assistant 的 About菜单的显示内容。myHelp.qhcp文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<QHelpCollectionProject version="1.0">
<assistant>
  <title>我的帮助系统</title>
  <applicationIcon>images/yafeilinux.png</applicationIcon>
  <cacheDirectory>cache/myHelp</cacheDirectory>
  <homePage>qthelp://yafeilinux.myHelp/doc/index.html</homePage>
  <startPage>qthelp://yafeilinux.myHelp/doc/index.html</startPage>
  <aboutMenuText>
    <text>关于该帮助</text>
  </aboutMenuText>
  <aboutDialog>
    <file>about.txt</file>
    <icon>images/yafeilinux.png</icon>
  </aboutDialog>
  <enableDocumentationManager>false</enableDocumentationManager>
  <enableAddressBar>false</enableAddressBar>
  <enableFilterFunctionality>false</enableFilterFunctionality>
</assistant>
<docFiles>
  <generate>
    <file>
      <input>myHelp.qhp</input>
      <output>myHelp.qch</output>
    </file>
  </generate>
  <register>
    <file>myHelp.qch</file>
  </register>
</docFiles>
</QHelpCollectionProject>

在assistant标签中对Qt Assistant的外观和功能进行定制,其中设置了标题,图标,缓存目录、主页、起始页、About菜单文本、关于对话框的内容和图标等,还关闭了一些没有用的功能。

缓存目录cacheDirectory是进行全文检索等操作时缓存文件要存放的位置。对于主页homePage和起始页startPage,这里使用了第二步中提到的Qt Assistant页面的URL,这个URL由“qthelp://”开始,然后是在.qhp文件中设置的命名空间,然后是虚拟文件夹,最后是具体的HTML文件名。

因为Qt Assistant可以添加或者删除文档来为多个应用程序提供帮助,但是这里只是为一个应用程序提供帮助,并且不希望删除我们的文档,所以禁用了文档管理器documentation manager;这里的文档集很小,而且只有一个过滤器部分,所以也关闭了地址栏address bar和过滤器功能filter functionality。

虽然第三步中已经生成了.qch文件并且在Qt Assistant中进行了注册,但那只是为了测试文件是否可用,其实完全可以跳过第三步,因为这里的docFiles标签中就完成了这一步的操作。不过与第三步不同的是,第三步是在默认的集合文件中注册的,而这里是在我们自己的集合文件中注册的。

第五步,生成.qhc文件。在命令行输入如下命令:

qcollectiongenerator myHelp.qhcp-o myHelp.qhc

为了测试定制的Qt Assistant ,输入如下命令:

assistant -collectionFile myHelp.qhc

这里在运行Qt Assistant时指定了集合文件为自己的.qhc文件,所以运行后只会显示自己的HTML文档。可以看到,现在Qt Assistant的图标也更改了,选择“帮助→关于该帮助”菜单项,这里是前面添加的about.txt文件的内容。

第六步,在程序中启动Qt Assistant。这里先要将Qt安装目录的bin目录中的assistant. exe程序复制到项目目录的documentation目录中。然后在上一节的程序中进行更改。为了启动Qt Assistant,须先创建了一个Assistant类。

首先向项目中添加新文件,模板选择C++类,类名为Assistant,基类不填写。完成后将assistant.h文件更改如下:

#ifndef ASSISTANT_H
#define ASSISTANT_H
#include <QString>
class QProcess;

class Assistant
{
public:
    Assistant();
    ~Assistant();
    void showDocumentation(const QString &file);
private:
    bool startAssistant();
    QProcess *proc;
};

#endif // ASSISTANT_H

Assistant类中主要是使用QProcess类创建一个进程来启动Qt Assistant,进程的知识会在第19章讲解。更改assistant.cpp文件的内容如下:

#include <QByteArray>
#include <QProcess>
#include <QMessageBox>
#include "assistant.h"

Assistant::Assistant()
    : proc(0)
{
}

Assistant::~Assistant()
{
    if (proc && proc->state() == QProcess::Running) {
        // 试图终止进程
        proc->terminate();
        proc->waitForFinished(3000);
    }
    // 销毁proc
    delete proc;
}

// 显示文档
void Assistant::showDocumentation(const QString &page)
{
    if (!startAssistant())
        return;
    QByteArray ba("SetSource ");
    ba.append("qthelp://yafeilinux.myHelp/doc/");
    proc->write(ba + page.toLocal8Bit() + '\n');
}

// 启动Qt Assistant
bool Assistant::startAssistant()
{
    // 如果没有创建进程,则新创建一个
    if (!proc)
        proc = new QProcess();

    // 如果进程没有运行,则运行assistant,并添加参数
    if (proc->state() != QProcess::Running) {
        QString app = QLatin1String("../myWhatsThis/documentation/assistant.exe");
        QStringList args;
        args << QLatin1String("-collectionFile")
             << QLatin1String("../myWhatsThis/documentation/myHelp.qhc");
        proc->start(app, args);
        if (!proc->waitForStarted()) {
            QMessageBox::critical(0, QObject::tr("my help"),
                                  QObject::tr("Unable to launch Qt Assistant (%1)").arg(app));
            return false;
        }
    }
    return true;
}

startAssistant()函数中使用QProcess创建了一个进程来启动Qt Assistant,这里使用了命令行参数来使用帮助集合文件, assistant.exe和 myHelp.qhc都使用了相对地址;在showDocumentation()函数中可以指定具体的页面作为参数来使Qt Assistant显示指定的页面;在析构函数中,如果进程还在运行,则终止进程,最后销毁了进程指针。

下面使用Assistant类来启动Qt Assistant。在 mainwindow.h文件中先添加前置声明:

class Assistant;

再添加private对象指针声明:

Assistant *assistant;

然后添加一个私有槽:

private slots:
void startAssistant();

在这里插入图片描述

转到mainwindow.cpp,添加头文件#include"assistant.h"
然后在构造函数中添加如下代码:

 QAction *help = new QAction("help",this);
    ui->mainToolBar->addAction(help);
    connect(help, &QAction::triggered, this, &MainWindow::startAssistant);

    // 创建Assistant对象
    assistant = new Assistant;

这里创建了一个help动作,并将他添加到工具栏中,可以使用该动作启动Qt Assistant。

下面添加statrAssistant()槽的定义:

void MainWindow::startAssistant()
{
    // 按下“help”按钮,运行Qt Assistant,显示index.html页面
    assistant->showDocumentation("index.html");
}

最后在析构函数中销毁assistant指针,即在MainWindow::~MainWindow()函数中代码:

MainWindow::~MainWindow()
{
    delete ui;
    // 销毁assistant
    delete assistant;
}

现在运行程序,按下工具栏上的 help动作就可以启动Qt Assistant了。

这里还要提示一下,如果要发布该程序,那么需要将documentation目录复制到发布目录中,这时运行程序,还会提示缺少一些dll文件,那么就可以根据提示在Qt安装目录的 bin目录中将相应的dll文件复制过来。

对应这个例子,可以在帮助中通过Simple Text Viewer Example关键字查看。

QtAssistant的定制可以通过Customizing Qt Assistant关键字查看。The Qt HelpFramework关键字对应的文档中还讲解了使用QHelpEngine的 API将帮助内容直接嵌入到应用程序中,感兴趣的读者可以参考一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt—帮助系统 的相关文章

  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • Qt Creator:如何区分 win32 和 win64

    我必须在 pro 文件中执行类似的操作 win32 LIBS L 3rdparty libusb win32 lib msvc llibusb else win64 LIBS L 3rdparty libusb win32 lib msvc
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何使用meta-toolchain-qt5构建Qt(带有QtWebEngine支持)?

    我正在尝试使用构建 Qtmeta toolchain qt5 但是当我通过这样做时poky glibc x86 64 meta toolchain qt5 cortexa7hf vfp vfpv4 neon toolchain 2 0 1
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • Qt 5.3 无法使 QCompass (QSensor) 在 Windows 8.1 上工作

    我无法让传感器在我的 Asus Transformer T100 上工作 磁力计和指南针无法启动 并且我从加速度计获得假值 始终 x 0 y 9 8 z 0 即使使用我的笔记本电脑 我总是得到相同的结果 第一段文字编辑 Initialisa
  • 将 QByteArray 从大端转换为小端

    我想我在这里有点不知所措 我尝试了这么简单的事情 我不敢相信没有任何内置的 Qt 使用 Qt 5 6 2 我尝试将 QByteArray 内的数据从大端转换为小端 总是从相同的测试 QByteArray 开始 就像这样 QByteArray

随机推荐

  • 阿里云大佬告诉你为什么学不会设计模式,归根到底还是方法不对

    最近总有读者在后台跟我说 工作几年 自己的代码质量似乎没有什么提升 我觉得他的情况非常典型 很多人应该或多或少都有过类似的经历 毕业几年 几乎一直在做复制黏贴的工作 偶尔会遇到原有业务扩展的需求 想简单应付一下完事的话 也不难 无非就是多加
  • 查询水果价格 (15分)

    给定四种水果 分别是苹果 apple 梨 pear 桔子 orange 葡萄 grape 单价分别对应为3 00元 公斤 2 50元 公斤 4 10元 公斤 10 20元 公斤 首先在屏幕上显示以下菜单 1 apple 2 pear 3 o
  • Hadoop学习——MapReduce的简单介绍及执行步骤

    MapReduce概述 MapReduce是一个分布式的计算框架 编程模型 最初由由谷歌的工程师开发 基于GFS的分布式计算框架 后来Cutting根据 Google Mapreduce 设计了基于HDFS的Mapreduce分布式计算框架
  • IDEA修改内存未生效原因和解决

    修改IDEA安装目录下的idea64 exe vmoptions server Xms1024m Xmx2048m XX ReservedCodeCacheSize 2048m 发现IDEA的内存修改并未生效 右下角显示依然是974M 原因
  • windows下进程间通信的(13种方法)

    Windows进程间的通信 迎风的祺 博客园 windows下进程间通信的 13种方法 phymat nico的专栏 CSDN博客 windows进程间通信
  • eclipse报错 parameterized types are only available if source level is 1.5 or greater

    preface 好久没有更新 blog 了 最近在 写新的项目 今天在用eclipse 出现了之前遇到的问题 这里记录下 问题 eclipse 控制台 报错 parameterized types are only available if
  • CUDA+OPENCV+PYTHON tensorflow 源码环境搭建

    CUDA OPENCV PYTHON tensorflow 源码环境搭建 接上文caffe环境安装 https blog csdn net u012350025 article details 104589982 主机环境ubuntu18
  • 基于C++的带权无向图的实现 (五)- 连通图和连通分量

    该系列文章是本人整理的有关带权无向图的数据结构和算法的分析与实现 若要查看源码可以访问我的github仓库 如有问题或者建议欢迎各位指出 目录 基于C 的带权无向图的实现 一 数据结构 基于C 的带权无向图的实现 二 遍历算法 基于C 的带
  • 台式计算机怎么看有没有开独显,台式机独立显卡怎么样打开

    给台式机插入了独立显卡 但不会打开怎么办呢 下面由学习啦小编给你做出详细的台式机独立显卡打开方法介绍 希望对你有帮助 台式机独立显卡打开方法一 把显示器的数据连接线接到独立显卡上 用的就是独立显卡 把显示器的数据线连接在主板的显示输出口上
  • MyEclipse8.5的安装过程

    1 双击进行安装 点Next接受 选择好路径后 等待安装完毕 2 选择路径 3 进入工作台如下图 4 配置Tomcat 工具栏 Window Preferences 5 Myeclipse Servers Tomcat 选择版本 勾选Ena
  • 2029:【例4.15】水仙花数

    2029 例4 15 水仙花数 时间限制 1000 ms 内存限制 65536 KB 提交数 1247 通过数 720 题目描述 求100 999中的水仙花数 若三位数ABC ABC A3 B3 C3 则称ABC为水仙花数 例如153 13
  • springboot2.x默认采用cglib代理,以及配置jdk动态代理的方法

    众所周知 springboot开启AOP需要在启动类加上注解 EnableAspectJAutoProxy 但开发过程中发现即使不加 EnableAspectJAutoProxy 注解 bean还是被代理过 而且是Cglib代理对象 此时在
  • win32下Qt5BLE蓝牙开发笔记

    BLE简介 BLE蓝牙是蓝牙2 0以上的蓝牙模块 经典蓝牙是蓝牙2 0以下的蓝牙 蓝牙分为客户端和服务器两端 经典蓝牙可以通过socket编程进行客户端与服务器之间的通信 与网络socket相似 BLE蓝牙则无法使用这种方式进行通信 BLE
  • ICASSP 2023说话人识别方向论文合集

    今年入选 ICASSP 2023 的论文中 说话人识别 声纹识别 方向约有64篇 初步划分为Speaker Verification 31篇 Speaker Recognition 9篇 Speaker Diarization 17篇 An
  • 算法竞赛当中的思考方法——方法论篇。

    方法论 万物皆朴素的第一性原理 几乎任何领域的任何问题的解决方案 都可以看作是 某个结构上的朴素方法的优化 计算机只能处理规模有限的问题 在给定规模且不考虑效率的情况下 问题一定存在朴素解法 具体手段有直接模拟 利用bit枚举 各种搜索算法
  • Spring Cloud面试8连问,谁顶得住?

    问题一 什么是 Spring Cloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序 提供与外部系统的集成 Spring cloud Task 一个生命周期短暂的微服务框架 用于
  • 数据结构-带头双向循环链表的基本实现(C语言,简单易懂,含全部代码)

    链表的概念和结构 概念 链表是一种物理存储结构上非连续 非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 结构 实际中链表的结构非常多样 以下情况组合起来就有8种链表结构 1 单向 双向 2 带头 不带头 3 循环 非循
  • java逆序输出一个整数_Java实现整数的逆序输出(三种方法)

    Java实现整数的逆序输出和C语言相似 下面我介绍三种方法 第一种 无限制整数的逆序输出 import java util Scanner class Cycle01 public static void main String args
  • Tulsi编译失败问题解决

    Tulsi编译失败 Xcode12 4 bazel 4 0 brew 20210218 tulsi最新 解决办法 跑了 usr local Cellar python 2 将这个目录去掉或者改名字为不可用 然后系统默认跑了python3就好
  • Qt—帮助系统

    一个完善的应用程序应该提供尽可能丰富的帮助信息 Qt中可以使用工具提示 状态提示以及 What s This 等简单的帮助提示 也可以使用Qt Assistant来提供强大的在线帮助 简单的帮助提示 已经讲到了工具提示和状态提示 这里简单介