【使用VS开发的第一个QT项目——实现相机功能(包括QT下载、配置、摄像头程序)】

news2024/12/28 22:50:00

使用VS开发的第一个QT项目

  • 一、QT(WIN10)安装
    • 1.首先下载QT(VS有对应的QT)
    • 2.安装QT
  • 二、将QT加载到VS中
  • 三、QT设置
    • 1.在VS"Qt Vs Tools"→"QT Versions"中添加"msvc2017_64"qmake的路径
    • 2.在"General"→"QT Designer"中将"False"改为"True"
  • 四、QT程序打包
    • 1.新建QT Widges项目,Base class也选择"QWidget"类(QMainWindow是一个含有菜单的窗口、QDialog是对话框、QWidget是不确定的窗口)
    • 2.先在VS中使用Release模式发布,在x64中找到生成的exe
    • 3.在空白处"shift"+右键打开Windows PowerShell模式,使用QT自带的搜索程序QT\mingw73_64\bin\windeployqt.exe将exe需要的动态库都拷贝过来
    • 4. 安装包制作,首先下载Inno Setup[官方链接](http://www.jrsoftware.org/isdl.php#stable)
    • 5.新建脚本模式
    • 6.修改程序信息
    • 7.设置打包程序位置
    • 8.添加原始exe和文件夹路径
    • 9.下面这个关联格式的不要点
    • 10.创建快捷方式(无需修改)
    • 11.设置安装向导(无需修改)
    • 12.选择安全模式(无需修改)
    • 13.语言选择(无需修改,没得中文)![请添加图片描述](https://img-blog.csdnimg.cn/3124dbb94c1a456cbaea5562f1a03503.png)
    • 14.设置安装文件的相关信息(生成的exe位置、名称、图标和安装时的密码)![请添加图片描述](https://img-blog.csdnimg.cn/ef024a7b497e401ebff94d432c62cbcb.png)
  • #五、第一个项目(摄像头播放)
    • 1.原代码(已改过命名方式)
    • 2.把cpp文件替换为下面得即可解决第一个问题
    • 3.多线程
    • 1.QObject实现思路

一、QT(WIN10)安装

1.首先下载QT(VS有对应的QT)

下载链接
windows程序的后缀是.exe
Ubuntu程序的后缀是.run

2.安装QT

按照安装指示操作、注册QT,然后出现”选择“界面时勾选“MinGW 7.3.0 64-bit”,“MSVC 2017 64-bit”;点击“Developer and Designer Tools”前的尖号,打开其中选项,勾选“MinGW 7.3.0 64-bit”。

二、将QT加载到VS中

在VS"工具"→"扩展与更新"→"联机"中搜索“QT”并下载,重启生效
在这里插入图片描述

三、QT设置

1.在VS"Qt Vs Tools"→"QT Versions"中添加"msvc2017_64"qmake的路径

在这里插入图片描述

2.在"General"→"QT Designer"中将"False"改为"True"

在这里插入图片描述

四、QT程序打包

1.新建QT Widges项目,Base class也选择"QWidget"类(QMainWindow是一个含有菜单的窗口、QDialog是对话框、QWidget是不确定的窗口)

在这里插入图片描述

2.先在VS中使用Release模式发布,在x64中找到生成的exe

在这里插入图片描述

3.在空白处"shift"+右键打开Windows PowerShell模式,使用QT自带的搜索程序QT\mingw73_64\bin\windeployqt.exe将exe需要的动态库都拷贝过来

在这里插入图片描述

4. 安装包制作,首先下载Inno Setup官方链接

5.新建脚本模式

请添加图片描述

6.修改程序信息

请添加图片描述

7.设置打包程序位置

请添加图片描述

8.添加原始exe和文件夹路径

请添加图片描述

9.下面这个关联格式的不要点

请添加图片描述

10.创建快捷方式(无需修改)

请添加图片描述

11.设置安装向导(无需修改)

请添加图片描述

12.选择安全模式(无需修改)

请添加图片描述

13.语言选择(无需修改,没得中文)请添加图片描述

14.设置安装文件的相关信息(生成的exe位置、名称、图标和安装时的密码)请添加图片描述

后面的一路ok就好了就可以打开了

#五、第一个项目(摄像头播放)

要用到opencv调摄像头,所以把opencv也配置到vs中:
1.在”VC++目录"→“包含目录”中增加opencv\bulid的include和include中的opencv2路径
2.在"库目录"中增加opencv\build\x64\vc15\lib路径
3.在"链接器"→"输入"→"附加依赖项"中增加opencv_worldxxx_lib(如果配置为Debug,选择opencv_worldxxxd.lib
如果为Release,选择opencv_worldxxx.lib)

1.原代码(已改过命名方式)

ui

/********************************************************************************
** Form generated from reading UI file 'QT_learning1.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_QT_LEARNING1_H
#define UI_QT_LEARNING1_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_QT_learning1Class
{
public:
    QPushButton *Open_Camera;
    QPushButton *Capture;
    QPushButton *Close_Camera;
    QLabel *Video;
    QLabel *Photo;
    QLabel *label;
    QLabel *label_2;

    void setupUi(QWidget *QT_learning1Class)
    {
        if (QT_learning1Class->objectName().isEmpty())
            QT_learning1Class->setObjectName(QString::fromUtf8("QT_learning1Class"));
        QT_learning1Class->resize(600, 400);
        Open_Camera = new QPushButton(QT_learning1Class);
        Open_Camera->setObjectName(QString::fromUtf8("Open_Camera"));
        Open_Camera->setGeometry(QRect(100, 330, 93, 28));
        Capture = new QPushButton(QT_learning1Class);
        Capture->setObjectName(QString::fromUtf8("Capture"));
        Capture->setGeometry(QRect(250, 330, 93, 28));
        Close_Camera = new QPushButton(QT_learning1Class);
        Close_Camera->setObjectName(QString::fromUtf8("Close_Camera"));
        Close_Camera->setGeometry(QRect(400, 330, 93, 28));
        Video = new QLabel(QT_learning1Class);
        Video->setObjectName(QString::fromUtf8("Video"));
        Video->setGeometry(QRect(40, 40, 224, 224));
        Photo = new QLabel(QT_learning1Class);
        Photo->setObjectName(QString::fromUtf8("Photo"));
        Photo->setGeometry(QRect(310, 40, 224, 224));
        label = new QLabel(QT_learning1Class);
        label->setObjectName(QString::fromUtf8("label"));
        label->setGeometry(QRect(110, 280, 81, 16));
        label_2 = new QLabel(QT_learning1Class);
        label_2->setObjectName(QString::fromUtf8("label_2"));
        label_2->setGeometry(QRect(410, 280, 72, 15));

        retranslateUi(QT_learning1Class);

        QMetaObject::connectSlotsByName(QT_learning1Class);
    } // setupUi

    void retranslateUi(QWidget *QT_learning1Class)
    {
        QT_learning1Class->setWindowTitle(QCoreApplication::translate("QT_learning1Class", "QT_learning1", nullptr));
        Open_Camera->setText(QCoreApplication::translate("QT_learning1Class", "\346\211\223\345\274\200\346\221\204\345\203\217\345\244\264", nullptr));
        Capture->setText(QCoreApplication::translate("QT_learning1Class", "\346\213\215\347\205\247", nullptr));
        Close_Camera->setText(QCoreApplication::translate("QT_learning1Class", "\345\205\263\351\227\255\346\221\204\345\203\217\345\244\264", nullptr));
        Video->setText(QString());
        Photo->setText(QString());
        label->setText(QCoreApplication::translate("QT_learning1Class", "\346\221\204\345\203\217\345\244\264\351\242\204\350\247\210", nullptr));
        label_2->setText(QCoreApplication::translate("QT_learning1Class", "\347\205\247\347\211\207", nullptr));
    } // retranslateUi

};

namespace Ui {
    class QT_learning1Class: public Ui_QT_learning1Class {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_QT_LEARNING1_H

h文件

#pragma once

#include <QtWidgets/QWidget>
#include "ui_QT_learning1.h"

#ifndef QT_LEARNING1_H
#define QT_LEARNING1_H

#include <opencv2\core\core.hpp>
#include <QWidget>
#include <QImage>
#include <QTimer>     // 设置采集数据的间隔时间


#include <QGraphicsScene>  
#include <QGraphicsView>  

#include <highgui/highgui_c.h>  //包含opencv库头文件

#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>  //opencv申明

#include <opencv.hpp>
using namespace cv;

namespace Ui {
	class QT_learning1;
}

class QT_learning1 : public QWidget
{
	Q_OBJECT

public:
	explicit QT_learning1(QWidget *parent = 0);
	~QT_learning1();

private slots:
	void openCamara();      // 打开摄像头
	void getFrame();       // 读取当前帧信息
	void closeCamara();     // 关闭摄像头。
	void takingPictures();  // 拍照

private:
	Ui::QT_learning1Class ui;
	QTimer    *timer;
	QImage    *imag;
	CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
	IplImage  *frame;
	VideoCapture capture1;
	Mat showimage;
	QImage Mat2Qimage(Mat cvImg);

	//QT_learning1(QWidget * parent);
		//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
};

#endif // QT_LEARNING1_H

cpp文件
(摄像头找不到得话,将capture1.open(0)中的0改成1或者-1试试)

#include "QT_learning1.h"
#include<stdlib.h>
#include <ctime>
#include<random>
#include<opencv.hpp>
using namespace cv;
using namespace std;





QT_learning1::QT_learning1(QWidget *parent) :
	QWidget(parent)
{
	ui.setupUi(this);
	connect(ui.Open_Camera, SIGNAL(clicked()), this, SLOT(openCamara()));
	connect(ui.Capture, SIGNAL(clicked()), this, SLOT(takingPictures()));
	connect(ui.Close_Camera, SIGNAL(clicked()), this, SLOT(closeCamara()));
	setWindowTitle(tr("Main Window"));

	timer = new QTimer(this);
	imag = new QImage();
	connect(timer, SIGNAL(timeout()), this, SLOT(getFrame()));//超时就读取当前摄像头信息
}
QT_learning1::~QT_learning1()
{

}

void QT_learning1::openCamara()
{
	capture1.open(0);                                            //打开摄像头,从摄像头中获取视频
	timer->start(10);

}

void QT_learning1::getFrame() {
	capture1 >> showimage;
	QImage imag = Mat2Qimage(showimage);

	ui.Video->setScaledContents(true);
	ui.Video->setPixmap(QPixmap::fromImage(imag));
}

void QT_learning1::closeCamara()
{
	timer->stop();
	ui.Video->clear();
	capture1.release();
}



void QT_learning1::takingPictures()
{
	capture1.open(0);
	capture1 >> showimage;
	QImage img = Mat2Qimage(showimage);
	ui.Photo->setScaledContents(true);
	ui.Photo->setPixmap(QPixmap::fromImage(img));

	string writePath = "./";
	string name;
	time_t now = time(0);
	name = writePath + to_string(now) + ".jpg";
	imwrite(name, showimage);

}


QImage QT_learning1::Mat2Qimage(Mat cvImg)
{
	// 8-bits unsigned, NO. OF CHANNELS = 1
	if (cvImg.type() == CV_8UC1)
	{
		QImage image(cvImg.cols, cvImg.rows, QImage::Format_Indexed8);
		// Set the color table (used to translate colour indexes to qRgb values)
		image.setColorCount(256);
		for (int i = 0; i < 256; i++)
		{
			image.setColor(i, qRgb(i, i, i));
		}
		// Copy input Mat
		uchar *pSrc = cvImg.data;
		for (int row = 0; row < cvImg.rows; row++)
		{
			uchar *pDest = image.scanLine(row);
			memcpy(pDest, pSrc, cvImg.cols);
			pSrc += cvImg.step;
		}
		return image;
	}
	// 8-bits unsigned, NO. OF CHANNELS = 3
	else if (cvImg.type() == CV_8UC3)
	{
		// Copy input Mat
		const uchar *pSrc = (const uchar*)cvImg.data;
		// Create QImage with same dimensions as input Mat
		QImage image(pSrc, cvImg.cols, cvImg.rows, cvImg.step, QImage::Format_RGB888);
		return image.rgbSwapped();
	}
	else if (cvImg.type() == CV_8UC4)
	{
		//		qDebug() << "CV_8UC4";
				// Copy input Mat
		const uchar *pSrc = (const uchar*)cvImg.data;
		// Create QImage with same dimensions as input Mat
		QImage image(pSrc, cvImg.cols, cvImg.rows, cvImg.step, QImage::Format_ARGB32);
		return image.copy();
	}
	else
	{
		//		qDebug() << "ERROR: Mat could not be converted to QImage.";
		return QImage();
	}
}

main.cpp

#include "QT_learning1.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
	QT_learning1 w;
    w.show();
    return a.exec();
}

效果
还行,但有两个问题:
1.拍照得到的照片失真,原因是打开摄像头和拍照重复使用摄像头接口,导致数据传输变慢、冲突
2.没有多线程,如果再来个功能或者运算量变大就over了
在这里插入图片描述

2.把cpp文件替换为下面得即可解决第一个问题

#include "QT_learning1.h"
#include<stdlib.h>
#include <thread>
#include <ctime>
#include<random>
#include<opencv.hpp>
using namespace cv;
using namespace std;


QT_learning1::QT_learning1(QWidget *parent) :
	QWidget(parent)
{
	ui.setupUi(this);
	connect(ui.Open_Camera, SIGNAL(clicked()), this, SLOT(openCamara()));
	connect(ui.Capture, SIGNAL(clicked()), this, SLOT(takingPictures()));
	connect(ui.Close_Camera, SIGNAL(clicked()), this, SLOT(closeCamara()));
	setWindowTitle(tr("Main Window"));

	timer = new QTimer(this);
	imag = new QImage();
	connect(timer, SIGNAL(timeout()), this, SLOT(getFrame()));//超时就读取当前摄像头信息
}
QT_learning1::~QT_learning1()
{

}

void QT_learning1::openCamara()
{
	capture1.open(0);                                            //打开摄像头,从摄像头中获取视频
	timer->start(10);

}

void QT_learning1::getFrame() {
	capture1 >> showimage;
	QImage imag = Mat2Qimage(showimage);

	ui.Video->setScaledContents(true);
	ui.Video->setPixmap(QPixmap::fromImage(imag));
}

void QT_learning1::closeCamara()
{
	timer->stop();
	ui.Video->clear();
	capture1.release();
}



void QT_learning1::takingPictures()
{
	QImage img = Mat2Qimage(showimage);
	ui.Photo->setScaledContents(true);
	ui.Photo->setPixmap(QPixmap::fromImage(img));

	string writePath = "./";
	string name;
	time_t now = time(0);
	name = writePath + to_string(now) + ".jpg";
	imwrite(name, showimage);

}


QImage QT_learning1::Mat2Qimage(Mat cvImg)
{
	// 8-bits unsigned, NO. OF CHANNELS = 1
	if (cvImg.type() == CV_8UC1)
	{
		QImage image(cvImg.cols, cvImg.rows, QImage::Format_Indexed8);
		// Set the color table (used to translate colour indexes to qRgb values)
		image.setColorCount(256);
		for (int i = 0; i < 256; i++)
		{
			image.setColor(i, qRgb(i, i, i));
		}
		// Copy input Mat
		uchar *pSrc = cvImg.data;
		for (int row = 0; row < cvImg.rows; row++)
		{
			uchar *pDest = image.scanLine(row);
			memcpy(pDest, pSrc, cvImg.cols);
			pSrc += cvImg.step;
		}
		return image;
	}
	// 8-bits unsigned, NO. OF CHANNELS = 3
	else if (cvImg.type() == CV_8UC3)
	{
		// Copy input Mat
		const uchar *pSrc = (const uchar*)cvImg.data;
		// Create QImage with same dimensions as input Mat
		QImage image(pSrc, cvImg.cols, cvImg.rows, cvImg.step, QImage::Format_RGB888);
		return image.rgbSwapped();
	}
	else if (cvImg.type() == CV_8UC4)
	{
		//		qDebug() << "CV_8UC4";
				// Copy input Mat
		const uchar *pSrc = (const uchar*)cvImg.data;
		// Create QImage with same dimensions as input Mat
		QImage image(pSrc, cvImg.cols, cvImg.rows, cvImg.step, QImage::Format_ARGB32);
		return image.copy();
	}
	else
	{
		//		qDebug() << "ERROR: Mat could not be converted to QImage.";
		return QImage();
	}
}

请添加图片描述
这样就ok了

3.多线程

C++中可直接使用thread库实现
而QT提供了两种方式实现多线程:
1.继承QThread的run函数,是个虚函数,会自动调用的
2.继承于QObject的类用moveToThread函数转移到一个Thread里
第一种QThread已经不推荐了,我们使用QObject实现

1.QObject实现思路

在这里插入图片描述

1.创键一个继承于 QObject 的自定义线程类(如:MyThread),用来盛放比较耗时,需要放入子线程的处理函数
(1)定义一个线程处理函数(如:MyWork),当然也可以定义多个,这时多个处理函数就共用一个子线程
(2)在处理函数中进行处理,此过程可能时间较长(如:QThread::sleep(1))
(3)在处理函数中发送处理完成的信号(如:emit signal_back()),当然该信号中可能含有处理的结果信息(如计算结果)

2、 在主线程(亦称界面线程)中创建一个子线程(QThread* subthread = new QThread(this))

3、新建一个自定义线程类对象(MyThread* m_MyThread = new MyThread())

4、将自定义线程类对象移入子线程容器中(m_MyThread->moveToThread(subthread)),其实也可以移入多个自定义线程类到同一个subthread中,这时他们就共享一个子线程了

5、连接主线程和子线程之间的信号和槽
(1)主线程——>子线程,主线程的信号和子线程的槽
connect ( this, &MainWindow::StartThread, m_MyThread, &MyThread::MyWork )
(2)子线程——>主线程,子线程的信号和主线程的槽
connect (m_MyThread, &MyThread::signal_back, this, &MainWindow::slot_handle_finish )

6、子线程使用完毕需要回收销毁,不然该线程会一直占用,而系统可分配的线程数量是有限的

(1)subthread->qiut(); //该停止函数比较弱,会等到线程处理函数MyWork()的任务执行完之后,才会停止线程

(2)subthread->wait();

所有通常会加入一个标志位,来终止任务。
未完待续。。。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

克里金插值(Kriging)在MATLAB中的实现【优化】

该部分是基于克里金插值&#xff08;Kriging&#xff09;在MATLAB中的实现&#xff08;克里金工具箱&#xff09;&#xff0c;由于在运行过程中有部分问题&#xff0c;基于此做的一些理解优化。 工具箱的下载见上面的链接&#xff0c;其提供了工具箱。 clc clearload(data_kr…

服务(第三十二篇)nginx做缓存服务器

nginx作为缓存服务配置语法 1、proxy_cache_path 配置语法&#xff08;即缓存路径配置语法&#xff09; Syntax&#xff1a;proxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] [manager_filesnumber] [manager_s…

python爬虫笔记

Python爬虫笔记 一. Urllib 1. 基础请求 指定url请求返回值解码返回结果的一些操作 import urllib.request as req # 定义一个url url http://www.baidu.com# 发送请求获得相应 res req.urlopen(url)# read返回字节形式的二进制数据,需要用指定编码来解码 content res.r…

Allure测试报告定制全攻略,优化你的Web自动化测试框架!

目录 前言&#xff1a; 1. Allure测试报告简介 2. Web自动化测试框架简介 3. 封装Web自动化框架 3.1 安装Selenium 3.2 封装Selenium 3.3 定制Allure测试报告 3.3.1 适配翻译插件 3.3.2 定制测试报告样式 4. 示例代码 5. 总结 前言&#xff1a; 随着现在Web应用的普…

【特征选择】基于二进制粒子群算法的特征选择方法(PNN概率神经网络分类)【Matlab代码#33】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 特征选择问题2. 二进制粒子群算法3. 概率神经网络&#xff08;PNN&#xff09;分类4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&…

day42_jsp

今日内容 零、 复习昨日 一、JSP 二、EL 三、JSTL 四、MVC 零、 复习昨日 一、JSP 1.0 引言 现有问题 在之前学习Servlet时&#xff0c;服务端通过Servlet响应客户端页面&#xff0c;有什么不足之处&#xff1f; 开发方式麻烦&#xff1a;继承父类、覆盖方法、配置Web.xml或注…

8.3:加强堆的应用

8.3&#xff1a;加强堆的应用 题目要求&#xff1a; 做一个加强堆的题目&#xff0c;给定一个整型数组&#xff0c;int[] arr&#xff1b;和一个布尔类型数组&#xff0c;boolean[] op 两个数组一定等长&#xff0c;假设长度为N&#xff0c;arr[i]表示客户编号&#xff0c;op…

【程序人生】上海城市开发者社区小聚有感

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

shell脚本入门-编写格式以及执行方式

Shell介绍 通过编写shell命令发送给linux内核去执行&#xff0c;操作就是计算机硬件&#xff0c;所以Shell命令是用户操作计算机硬件的桥梁 Shell是命令&#xff0c;类似与windows系统的Dos命令 Shell是一门程序设计语言&#xff0c;shell里面含有变量&#xff0c;函数&#xf…

低代码助力企业数字化转型:构建高效业务系统的新选择

在当今数字化时代&#xff0c;企业数字化转型已经成为业界的热门话题。随着全球各大企业逐渐意识到数字化转型的重要性&#xff0c;越来越多的公司开始采用低代码开发平台作为数字化转型的工具&#xff0c;以低成本高效率构建业务系统&#xff0c;实现数字化转型。 但现实情况是…

Less基础速学 —— 混入、运算、继承

Less 混合 在上一篇内容中就已经简单的了解了关于CSS预处理器 —— Less&#xff0c;本篇就往下讲Less中的混合&#xff0c;什么是混合&#xff1f;就是将一系列属性从一个规则集引入到另外一个规则集的方式。下面来看一下它的混合方式有哪些&#xff1f; 普通混合 <div …

使用OpenCvSharp来计算图像的清晰度(可实现相机自动对焦)

相机自动对焦&#xff0c;其实是对相机成像的清晰值得计算&#xff0c;若对焦不清晰&#xff0c;成像的清晰度低&#xff0c;视觉效果模糊。若是在工业检测行业&#xff0c;对焦不准确&#xff0c;可能导致信息不正确&#xff1b;对焦准确的图像&#xff0c;其清晰度高&#xf…

长连接心跳原理与机制工程上踩坑与优化

QA: 业务上对于心跳间隔一般怎么确定? 心跳间隔的确定一般需要根据具体业务场景和需求来进行。以下是一些常见的确定心跳间隔的方法&#xff1a; 根据应用场景和需求来确定心跳间隔。例如&#xff0c;在智能手环等健康监测设备中&#xff0c;心跳间隔通常设置为几秒钟到几分钟…

华为OD机试之过滤组合字符串(Java源码)

过滤组合字符串 题目描述 每个数字关联多个字母&#xff0c;关联关系如下&#xff1a; 0 关联 “a”,”b”,”c”1 关联 “d”,”e”,”f”2 关联 “g”,”h”,”i”3 关联 “j”,”k”,”l”4 关联 “m”,”n”,”o”5 关联 “p”,”q”,”r”6 关联 “s”,”t”7 关联 “u”…

六级备考24天|CET-6|翻译技巧4|翻译红楼梦|22:40~23:40

目录 作题步骤 红楼梦 12 PRACTICE ANSWER​ 时态问题 3 ANSWER 4 PRACTICE ANSWER ​ 5​ PRACTICE ANSWER 合并 ​ 全文翻译​ 作题步骤 不要拿到题目就动笔、一定要先读题、重建逻辑、找句子主干、有能力可以润色简化&#xff01; 红楼梦 12 PRACTICE Dream of th…

【java】leetcode 二叉树展开为链表

二叉树展开为链表 leetcode114 .二叉树展开为链表解题思路二叉树专题&#xff1a; leetcode114 .二叉树展开为链表 114 leetcode 链接。可以打开测试 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#x…

【Redis】共同关注列表与基于Feed流的关注消息滚动分页推送的实现

目录 一、共同关注 1、思路 2、实现步骤 二、Feed流 1、概念 2、需求 3、TimeLine的三种模式 1.拉 2.推 3.推拉结合 4、TimeLine三种模式的区别 三、关注推送 1、需求 2、实现思路 3、Redis数据结构的选择 4、滚动分页 5、代码实现 1.博主 2.粉丝 一、共同关…

Packet Tracer - 在 VTY 线路上配置 ACL

Packet Tracer - 在 VTY 线路上配置 ACL 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 路由器 F0/0 10.0.0.254 255.0.0.0 不适用 PC NIC 10.0.0.1 255.0.0.0 10.0.0.254 笔记本电脑 NIC 10.0.0.2 255.0.0.0 10.0.0.254 拓扑图 目标 第 1 部分&#…

企业性能测试全面解析,一步步教你进行性能测试!

目录 前言&#xff1a; 性能需求调研 性能测试计划制定 性能测试执行 性能测试结果分析与优化 结尾&#xff1a; 前言&#xff1a; 在软件开发过程中&#xff0c;性能测试是一个非常重要的环节。性能测试的主要目的是评估系统在负载情况下的响应时间、吞吐量、稳定性等指…

【C语言】二分查找(含图解)

文章目录 1. 二分查找思想2. 代码实现2.1 未封装函数2.2 封装函数&#xff08;使用while循环&#xff09;2.3 封装函数&#xff08;使用递归&#xff09; 1. 二分查找思想 二分法&#xff1a;二分查找算法是一种在有序数组中查找某一特定元素的搜索算法&#xff0c;其思想就是…