Qt开发 入门

2023-11-12

1.Qt概述

什么是Qt

不论我们学习什么样的知识点首先第一步都需要搞明白它是什么,这样才能明确当前学习的方向是否正确,下面给大家介绍一下什么是Qt。

  • Qt是一个跨平台的C++应用程序开发框架

    • 具有短平快的优秀特质: 投资少、周期短、见效快、效益高
    • 几乎支持所有的平台, 可用于桌面程序开发以及嵌入式开发
    • 有属于自己的事件处理机制
    • 可以搞效率的开发基于窗口的应用程序。
  • Qt是标准C++的扩展, C++的语法在Qt中都是支持的

    • 良好封装机制使得Qt的模块化程度非常高,可重用性较好,可以快速上手。
    • Qt提供了一种称为 signals/slots 的安全类型来替代 callback(回调函数),这使得各个元件 之间的协同工作变得十分简单。

Qt的特点

知道了Qt是什么之后,给大家介绍一下Qt这个框架的一些优点,就是因为具有了这些优秀的特质才使得现在很多企业都首选Qt进行基于窗口的应用程序开发,并且近年来市场对Qt程序猿的需求也在不断攀升。

  • 广泛用于开发GUI程序,也可用于开发非GUI程序。

  • 有丰富的 API

    • Qt 包括多达250个以上的C++ 类
    • 可以处理正则表达式。
  • 支持 2D/3D 图形渲染,支持 OpenGL

  • Qt给程序猿提供了非常详细的官方文档

  • 支持XML,Json

  • 框架底层模块化, 使用者可以根据需求选择相应的模块来使用

  • 可以轻松跨平台

    • 和Java的跨平台方式不同
    • 在不同的平台使用的是相同的上层接口,但是在底层封装了不同平台对应的API。

Qt中的模块

Qt类库里大量的类根据功能分为各种模块,这些模块又分为以下几大类:

  • Qt 基本模块(Qt Essentials):提供了 Qt 在所有平台上的基本功能。

  • Qt 附加模块(Qt Add-Ons):实现一些特定功能的提供附加价值的模块。

  • 增值模块(Value-AddModules):单独发布的提供额外价值的模块或工具。

  • 技术预览模块(Technology Preview Modules):一些处于开发阶段,但是可以作为技术预览使用的模块。

  • Qt 工具(Qt Tools):帮助应用程序开发的一些工具。

在这里插入图片描述

2.第一个Qt项目

创建项目

创建基于窗口的Qt应用程序

在这里插入图片描述

在这里插入图片描述

指定项目的存储路径

在这里插入图片描述

  • 项目名称根据需求自己指定即可
  • 在指定项目的存储路径的时候, 路径中不能包含中文

指定默认的窗口类的名字以及窗口的类型

在这里插入图片描述

选择编译套件, 编译套件用于项目文件的编译, 如果安装了多个编译套件, 在这里选择其中一个就可以了。

在这里插入图片描述

选择版本控制工具, 比如: git, svn 等, 可以不指定。

在这里插入图片描述

项目文件

在创建的Qt项目中自动生成了一个后缀为 .pro 的项目文件,该文件中记录着项目的一些属性信息,具体信息如下:

# 在项目文件中, 注释需要使用 井号(#)
# 项目编译的时候需要加载哪些底层模块
QT       += core gui 

# 如果当前Qt版本大于4, 会添加一个额外的模块: widgets
# Qt 5中对gui模块进行了拆分, 将 widgets 独立出来了
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
   
# 使用c++11新特性
CONFIG += c++11	

#如果在项目中调用了废弃的函数, 项目编译的时候会有警告的提示    
DEFINES += QT_DEPRECATED_WARNINGS

# 项目中的源文件
SOURCES += \
        main.cpp \
        mainwindow.cpp
        
# 项目中的头文件
HEADERS += \
        mainwindow.h
        
# 项目中的窗口界面文件
FORMS += \
        mainwindow.ui

main.cpp

在这个源文件中有程序的入口函数main(),下面给大家介绍下这个文件中自动生成的几行代码:

#include "mainwindow.h"		// 生成的窗口类头文件
#include <QApplication>		// 应用程序类头文件

int main(int argc, char *argv[])
{
    // 创建应用程序对象, 在一个Qt项目中实例对象有且仅有一个
    // 类的作用: 检测触发的事件, 进行事件循环并处理
    QApplication a(argc, argv);
    // 创建窗口类对象
    MainWindow w;
    // 显示窗口
    w.show();
    // 阻塞函数,应用程序对象开始事件循环, 保证应用程序不退出
    return a.exec();
}

mainwindow.ui

在Qt中每一个窗口都对应一个可编辑的可视化界面(*.ui), 这个界面对应的是一个xml格式的文件, 一般情况下不需要在xml格式下对这个文件进行编辑, 关于这个文件结构了解即可。

<!-- 双击这个文件看到的是一个窗口界面, 如果使用文本编辑器打开看到的是一个XML格式的文件 -->
<!-- 看不懂这种格式没关系, 我们不需要在这种模式下操作这个文件。 -->
<!-- 这里只是给大家介绍这个文件的本质 -->
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget"/>
  <widget class="QMenuBar" name="menubar"/>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

mainwindow.h

这个文件是窗口界面对应的类的头文件。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>		// Qt标准窗口类头文件

QT_BEGIN_NAMESPACE
// mainwindow.ui 文件中也有一个类叫 MainWindow, 将这个类放到命名空间 Ui 中
namespace Ui { class MainWindow; }	
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT	// 这个宏是为了能够使用Qt中的信号槽机制

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;		// 定义指针指向窗口的UI对象
};
#endif // MAINWINDOW_H

mainwindow.cpp

这个文件是窗口界面对应的类的源文件。

#include "mainwindow.h"
#include "ui_mainwindow.h"

//构造函数
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)	// 基于mainwindow.ui创建一个实例对象
{
    // 将 mainwindow.ui的实例对象和当前类的对象进行关联
    // 这样同名的两个类对象就产生了关联, 合二为一了
    ui->setupUi(this);  
}

//析构函数
MainWindow::~MainWindow()
{
    delete ui;
}

3.Qt中的窗口类

我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项, 分别为: QMainWindow、QDialog、QWidget如下图:
在这里插入图片描述

  • 常用的窗口类有3个

    • 在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的其中一个
  • QWidget

    • 所有窗口类的基类

    • Qt中的控件(按钮, 输入框, 单选框…)也属于窗口, 基类都是QWidget

    • 可以内嵌到其他窗口中: 没有边框

    • 可以不内嵌单独显示: 独立的窗口, 有边框

  • QDialog

    • 对话框类, 后边的章节会具体介绍这个窗口

    • 不能内嵌到其他窗口中

  • QMainWindow

    • 有工具栏, 状态栏, 菜单栏, 后边的章节会具体介绍这个窗口

    • 不能内嵌到其他窗口中

QWidget

新建一个Qt设计师界面类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

窗口的显示

  • 内嵌窗口

    • 依附于某一个大的窗口, 作为了大窗口的一部分
    • 大窗口就是这个内嵌窗口的父窗口
    • 父窗口显示的时候, 内嵌的窗口也就被显示出来了
  • 不内嵌窗口

    • 这类窗口有边框, 有标题栏

    • 需要调用函数才可以显示

编写mainwindows.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testwidget.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    //一般在qt的构造函数中进行初始化操作
    //显示当前窗口的时候,显示另外一个窗口TestWidget
    //创建窗口对象,没有给W对象指定父对象
    TestWidget* w = new TestWidget;
    w->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}

在这里插入图片描述

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //一般在qt的构造函数中进行初始化操作
    //显示当前窗口的时候,显示另外一个窗口TestWidget
#if 0
    //创建窗口对象,没有给W对象指定父对象
    //要显示这个窗口必须要进行show()操作
    TestWidget* w = new TestWidget;
    w->show();
#else
#endif

#if 1
    // 创建窗口对象,给W对象指定父对象
    // explicit TestWidget(QWidget *parent = nullptr);
    // 如果创建一个窗口对象的时候给其指定了父对象,这个窗口就不是一个独立窗口
    // 这样的话当前父窗口显示的时候,子窗口就一并被显示出来了
    // 这时候子窗口是没有边框的
    TestWidget* w = new TestWidget(this);
#else
#endif
}

在这里插入图片描述

QDialog

创建一个QDiglog界面类
在这里插入图片描述
非模态显示

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //一般在qt的构造函数中进行初始化操作
    //显示当前窗口的时候,显示另外一个窗口TestWidget
#if 1
    //创建窗口对象,没有给W对象指定父对象
    //要显示这个窗口必须要进行show()操作
    TestWidget* w = new TestWidget;
    w->show();
#else
    // 创建窗口对象,给W对象指定父对象
    // explicit TestWidget(QWidget *parent = nullptr);
    // 如果创建一个窗口对象的时候给其指定了父对象,这个窗口就不是一个独立窗口
    // 这样的话当前父窗口显示的时候,子窗口就一并被显示出来了
    // 这时候子窗口是没有边框的
    TestWidget* w = new TestWidget(this);
#endif

    //创建对话框窗口
    Dialog *dlg = new Dialog();
    //非模态
    dlg->show();
}

在这里插入图片描述
模态显示

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //一般在qt的构造函数中进行初始化操作
    //显示当前窗口的时候,显示另外一个窗口TestWidget
#if 1
    //创建窗口对象,没有给W对象指定父对象
    //要显示这个窗口必须要进行show()操作
    TestWidget* w = new TestWidget;
    w->show();
#else
    // 创建窗口对象,给W对象指定父对象
    // explicit TestWidget(QWidget *parent = nullptr);
    // 如果创建一个窗口对象的时候给其指定了父对象,这个窗口就不是一个独立窗口
    // 这样的话当前父窗口显示的时候,子窗口就一并被显示出来了
    // 这时候子窗口是没有边框的
    TestWidget* w = new TestWidget(this);
#endif

#if 0
    //创建对话框窗口
    Dialog *dlg = new Dialog();
    //非模态
    dlg->show();
#else
    //创建对话框窗口
    Dialog *dlg = new Dialog();
    //模态,exec()
    //阻塞程序的执行
    dlg->exec();
#endif
}

在这里插入图片描述
运行后发现只能拖动Dialog的窗口,主窗口没有显示,因为Dialog被阻塞了,而主窗口需要在构造函数初始化结束才会显示。

4.坐标体系

在Qt关于窗口的显示是需要指定位置的,这个位置是通过坐标来确定的,所有坐标的选取又都是基于坐标原点来确定的,关于这些细节的确定,下面依次给大家进行讲解。

窗口的坐标原点

所有坐标的确定都需要先找到坐标原点, Qt的坐标原点在窗口的左上角

  • x轴向右递增
  • y轴向下递增
    在这里插入图片描述

窗口的相对坐标

在一个Qt窗口中一般都有很多子窗口内嵌到这个父窗口中,其中每个窗口都有自己的坐标原点,子窗口的位置也就是其使用的坐标点就是它的父窗口坐标体系中的坐标点。
在这里插入图片描述

  • 在Qt的某一个窗口中有可能有若干个控件, 这个控件都是嵌套的关系

    • A窗口包含B窗口, B窗口包含C窗口
  • 每个窗口都有坐标原点, 在左上角

    • 子窗口的位置是基于父窗口的坐标体系来确定的, 也就是说通过父窗口左上角的坐标点来确定自己的位置
  • Qt中窗口显示的时候使用的相对坐标, 相对于自己的父窗口

  • 将子窗口移动到父窗口的某个位置

示例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->move(10,10);

    // 创建一个按钮,让这个按钮作为当前创建的子控件
    QPushButton* btnA = new QPushButton(this);
    // 移动按钮的位置
    btnA->move(10,10);
    // 给按钮设置固定大小
    btnA->setFixedSize(200,200);

    // 创建第二个按钮,让这个按钮作为当前创建的子控件
    QPushButton* btnB = new QPushButton(btnA);
    // 移动按钮的位置
    btnB->move(10,10);
    // 给按钮设置固定大小
    btnB->setFixedSize(100,100);

    // 创建第二个按钮,让这个按钮作为当前创建的子控件
    QPushButton* btnC = new QPushButton(btnB);
    // 移动按钮的位置
    btnC->move(10,10);
    // 给按钮设置固定大小
    btnC->setFixedSize(50,50);
}

在这里插入图片描述

内存回收

在Qt中创建对象的时候会提供一个 Parent对象指针(可以查看类的构造函数),下面来解释这个parent到底是干什么的。

QObject是以对象树的形式组织起来的。当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。这相当于,在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表。当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!

QWidget是能够在屏幕上显示的一切组件的父类。QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。

Qt 引入对象树的概念,在一定程度上解决了内存问题。

当一个QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。

任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的。

在这里插入图片描述
综上所述, 我们可以得到一个结论: Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收, 如果想要在Qt中实现内存的自动回收, 需要满足以下两个条件:

  • 创建的对象必须是QObject类的子类(间接子类也可以)
    • QObject类是没有父类的, Qt中有很大一部分类都是从这个类派生出去的
    • Qt中使用频率很高的窗口类和控件都是 QObject 的直接或间接的子类
  • 创建出的类对象, 必须要指定其父对象是谁, 一般情况下有两种操作方式:
// 方式1: 通过构造函数
// parent: 当前窗口的父对象, 找构造函数中的 parent 参数即可
QWidget::QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
QTimer::QTimer(QObject *parent = nullptr);

// 方式2: 通过setParent()方法
// 假设这个控件没有在构造的时候指定符对象, 可以调用QWidget的api指定父窗口对象
void QWidget::setParent(QWidget *parent);
void QObject::setParent(QObject *parent);

测试

//SubWindows.cpp
#include "subwindows.h"
#include "ui_subwindows.h"
#include <QDebug>

SubWindows::SubWindows(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::SubWindows)
{
    ui->setupUi(this);
}

SubWindows::~SubWindows()
{
    qDebug() << "我是SubWindows,我被析构了";
    delete ui;
}

//MainWindows.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "subwindows.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    SubWindows* sub = new SubWindows(this);
    sub->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}

在这里插入图片描述
关闭主窗口后,观察终端
在这里插入图片描述

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

Qt开发 入门 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

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

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 性价比较高的笔记本电脑推荐

    推荐一 联想小新Air14锐龙版 优点 6核处理器 Zen2架构 性能释放高达26w 高色域屏幕 支持DC调光 硬盘扩展性好 双M 2插槽 有USB C接口 支持PD充电 缺点 单USB C接口 充电时占用接口 推荐二 惠普 ZBook S
  • antDv 级联选择器(a-cascader)通过接口动态加载数据

    每次子选择器的内容都是通过将父级id传给接口获取到 最终保存到data中参数selectItem格式为 xxx xx x
  • 计算机网络与服务器

    目录 架构体系及相关知识 三层架构 四层架构 常见的应用的模式 OSI模型 分层 数据链路层 TCP IP模型 TCP和UDP都是传输层的协议 TCP三次握手 四次次分手 URL HTTP协议详解 网址URL 结构化 报文行 报文头 空行
  • (G)ZS-CMR数据划分

    G ZS CMR 即 广义 零样本跨模态检索 设置类比 广义 零样本学习 G ZSL 这里记录两种划分 不限 CMR 也可以是 image retrieval ZS CMR 参考 1 类比 ZSL 整个数据集先从 class 角度分 see
  • 【java基础】java关键字总结及详解

    Java关键字是电脑语言里事先定义的 有特别意义的标识符 有时又叫保留字 还有特别意义的变量 Java的关键字对Java的编译器有特殊的意义 他们用来表示一种数据类型 或者表示程序的结构等 关键字不能用作变量名 方法名 类名 包名和参数 一
  • “应用程序配置不正确,应用程序未能启动” 错误的解决

    转载自 http hi baidu com xunxun129 blog item 6b311ccf24f4900992457e87 html 一 问题描述 今天在虚拟机上装了XP系统 但运行一个win32 Console程序时弹出对话框
  • 【第八章 IDEA中常用快捷键】

    第八章 IDEA中常用快捷键 1 Ctrl Y 删除光标所在行的所有内容 Ctrl X也可以 2 Ctrl D 快速向下复制当前行的内容 3 Ctrl W 递进式选中代码 可以先选中光标所在的一部分代码 连续按这个快捷键会在原来的基础上继续
  • 3dsmax子菜单无法选择_超全!!3ds Max重要的快捷键指令都在这里!画图速度提高一倍...

    室内设计胶囊 每个人都在努力的学习 感觉自己有一段时间没有练习了 只是偶尔工作的时候用用 大家都在努力 那我也出一点点力量吧 有同学说3ds Max 里面的快捷键实在太多了 全部记住有些吃力 能不能整理一份重要的 常用的快捷键 这样在记忆的
  • 史上最全 Vue 前端代码风格指南

    这篇文章是在公众号JS每日一题里抄过来的 觉得有用 收藏在这里 一 命名规范 市面上常用的命名规范 camelCase 小驼峰式命名法 首字母小写 PascalCase 大驼峰式命名法 首字母大写 kebab case 短横线连接式 Sna
  • Vue3 详细教程

    文章目录 一 API 风格 1 1 选项式 API 1 2 组合式 API 二 Vue 指令 2 1 文本插值 2 2 v html 标签元素 2 3 v on 绑定事件 2 4 v show 隐藏元素 2 5 v if 消除元素 2 6
  • Error:JAVA_HOME is not set and could not be found

    解决办法 打开hadoop etc hadoop目录下的文件hadoop env sh 将语句 export JAVA HOME JAVA HOME 修改为 export JAVA HOME 你的java路径 比如我是将其修改为 expor
  • Apache服务

    Apache服务 apache与nginx服务的区别 什么是服务 服务是具备处理客户端请求能力的程序 网站服务就是可以处理http请求并回复响应报文及数据 apache相关文件 主配置文件 etc httpd conf httpd conf
  • HEIF & HEVC 你知道多少?

    点击上方 iOS开发 选择 置顶公众号 关键时刻 第一时间送达 在升级 iOS 11 之后 iPhone 7 及更新的设备内的照片存储将不再用 JPEG 了 而采用了一种新的图片格式 HEIF 发音同 heef 在 iOS 中对应的文件后缀
  • 百度站长HTML添加301错误,搜索资源平台(百度站长)添加网站 使用文件验证 验证失败,原因:未知原因:301的解决办法...

    搜索资源平台 百度站长 添加网站 使用文件验证 验证失败 原因 未知原因 301的解决办法 之前使用过百度站长后台添加新的网站时 从没遇到过问题 一般都是选择第一种验证方式 文件验证 文件验证应该是很简单的事 直接注册账号进行登录 再把文件
  • Unity游戏基本框架

    个人总结笔记 参考自B站各教程 希望对他人也有所帮助 对我自己也方便复习 感谢唐老狮的教学 目录 文件夹管理 单例模式基类 单例模式介绍 Unity中的单例模式 C 中泛型的知识 继承MonoBehaviour的单例基类模式 缓存池模块 常
  • java基础

    Java基础 Java基础特性 与cmd的交互 1 1 什么是cmd 就是在windows操作系统中 利用命令行的方式去操作计算机 我们可以利用cmd命令去操作计算机 比如 打开文件 打开文件夹 创建文件夹等 1 2 如何打开CMD窗口 按
  • 【路由篇】01. 电脑远程访问小米路由器硬盘文件

    简介 自带硬盘的小米路由器可以保存照片 视频等文件 通过手机的小米路由器APP可以远程查看 非常方便 但是美中不足的是电脑无法远程访问小米路由器的文件 这就让小米路由器硬盘的功能大打折扣了 如果电脑可以远程访问小米路由器硬盘的话 当我们在外
  • 遍历一个HashMap

    可以通过2种方法遍历HashMap Map map new HashMap for Iterator iter map entrySet iterator iter hasNext Map Entry entry Map Entry ite
  • Centos 6.5、7升级安装openssh8.2p1

    因centos7自带的ssh版本较低 存在高危漏洞 故升级到最新版本 目前是8 2p1 注意 升级ssh存在一定的危险性 一旦不成功可能无法通过远程连接到系统 因此在升级之前最好先安装vnc或者telnet等远程服务 1 准备工作 查看下当
  • Qt开发 入门

    1 Qt概述 什么是Qt 不论我们学习什么样的知识点首先第一步都需要搞明白它是什么 这样才能明确当前学习的方向是否正确 下面给大家介绍一下什么是Qt Qt是一个跨平台的C 应用程序开发框架 具有短平快的优秀特质 投资少 周期短 见效快 效益