基于Qt和VS2017的高仿Win7图片浏览器制作

         这几天一直在忙着做一个图片浏览器,花费了很多的时间去调试,最终实现结果和win7自带的图片浏览器基本功能差不多,主要工作在QLabel与图片的大小变化还有翻转的时候大小变化的问题,问题很多,但是都解决了,先看一个作品吧。

        

        

                                                  

        主要思路就是添加action,给action注册事件,然后在那些前一页,后一页,顺时针翻转。逆时针翻转等的函数中写算法,控制图片动作。

1.接下来是主要的几个函数,先是open:

void PictureBrowsing::on_actionOpen_O_triggered() {
	int g, k;
	filename = QFileDialog::getOpenFileName(this, tr("Select image:"),".", tr("Images (*.png *.bmp *.jpg *.gif)"));
	if (filename.isEmpty())
		return;

	if (!image.load(filename)) {
		QMessageBox::information(this, tr("Error"), tr("Open file error"));
		return;	
	}
	getImInfoList();
	
	imageShow();
	setWindowTitle(QFileInfo(filename).fileName()+tr("-imageViewer"));

}

2.其中的imageShow()函数(注意,后面也会用到这个自定义的函数)

void PictureBrowsing::imageShow()
{

	QPixmap pixmap = QPixmap::fromImage(image);
	pixmap = pixmap.scaled(ui.centralWidget->width() - 50, ui.centralWidget->height() - 50, Qt::KeepAspectRatio);
	pix = pixmap;//全局pix
	QSize imagesize = pixmap.size();
	ui.imageLabel->resize(imagesize);//重新调整label大小以适应图片大小
	ui.imageLabel->setPixmap(pixmap);
}

3.其中的getImInfoList()函数(此函数主要是将一个文件夹中的所有图片格式的路径指针存储到一个数组imgInfoList中,以便在按下前一页,或者后一页时,取出数组中指针对应的图片)

void PictureBrowsing::getImInfoList() {
	imgInfoList.clear();
	path = QFileInfo(filename).absolutePath();
	QDir dir = QFileInfo(filename).absoluteDir();
	QFileInfoList infoList = dir.entryInfoList(QDir::Files);

	QFileInfo info;
	for (int i = 0; i < infoList.count(); i++) {
		info = infoList.at(i);
		QString suffix = info.suffix();

		if (suffix == "jpg" || suffix == "bmp" || suffix == "png") {
			imgInfoList.append(info);
		}
	}
	QFileInfo curImageInfo = QFileInfo(filename);
	for (int j = 0; j < imgInfoList.count(); j++) {
		info = imgInfoList.at(j);
		if (info.fileName() == curImageInfo.fileName()) {
			index = j;
		}
	}
}

4.“上一张”按钮

void PictureBrowsing::on_actionPrevious_P_triggered()
{
	
	index = index - 1;
	int count = imgInfoList.count();
	if (index == -1)
		index = count - 1;
	filename.clear();
	filename.append(path);
	filename += "/";
	filename += imgInfoList.at(index).fileName();

	//QImage image;
	if (!image.load(filename)) {
		QMessageBox::information(this,tr("Error"),tr("Open file error"));
		return;
	}
	imageShow();
	setWindowTitle(QFileInfo(filename).fileName() + tr("-imageViewer"));
}

5.“下一张”按钮

void PictureBrowsing::on_actionNext_N_triggered()
{
	index = index + 1;
	int count = imgInfoList.count();
	if (index == count) {
		index = 0;
	}
	filename.clear();
	filename.append(path);
	filename += "/";
	
	filename += imgInfoList.at(index).fileName();

	if (!image.load(filename)) {
		QMessageBox::information(this,tr("Error"),tr("Open file Error"));
		return;
	}
	imageShow();
	setWindowTitle(QFileInfo(filename).fileName() + tr("-imageViewer"));

}

6.顺时针旋转

void PictureBrowsing::on_actionClockWise_C_triggered()
{
	
	QMatrix matrix;
	QPixmap pixmap;


	imageAngle += 1;
	imageAngle = imageAngle % 4;
	matrix.rotate(imageAngle*90);

	image.load(filename);

	image = image.transformed(matrix);
	imageShow();


}

7.逆时针旋转

void PictureBrowsing::on_actionAntiClockWise_A_triggered()
{
	//QImage imgRotate;
	QMatrix matrix;
	QPixmap pixmap;
	//QImage image;

	imageAngle += 3;
	imageAngle = imageAngle % 4;
	matrix.rotate(imageAngle * 90);

	image.load(filename);
	//imgRotate = image.transformed(matrix);
	image = image.transformed(matrix);
	imageShow();


}

8.放大

void PictureBrowsing::on_actionZooming_Out_O_triggered()
{
	
	QMatrix matrix;
	QPixmap pixmap;
	image.load(filename);
	matrix.rotate(imageAngle * 90);
	image = image.transformed(matrix);


	pixmap = QPixmap::fromImage(image);
	pixmap = pixmap.scaled(pix.width()*1.2, pix.height()*1.2, Qt::KeepAspectRatio);
	pix = pix.scaled(pix.width()*1.2, pix.height()*1.2, Qt::KeepAspectRatio);
	QSize imagesize = pixmap.size();
	ui.imageLabel->setPixmap(pixmap);

}

9.缩小

void PictureBrowsing::on_actionZooming_in_I_triggered()
{
	
	 QMatrix matrix;
	 QPixmap pixmap;
	 image.load(filename);
	 matrix.rotate(imageAngle * 90);
	 image = image.transformed(matrix);
	 pixmap = QPixmap::fromImage(image);
	 pixmap = pixmap.scaled(pix.width()*0.8, pix.height()*0.8, Qt::KeepAspectRatio);
	 pix = pix.scaled(pix.width()*0.8, pix.height()*0.8, Qt::KeepAspectRatio);
	QSize imagesize = pixmap.size();
	ui.imageLabel->setPixmap(pixmap);
}

好了,鉴于时间原因,我把源代码都放上去了,如果有需要全部代码的,可以到这里下载,注意,我是用Qt+VS,用Qt Creator也可以参考,

                                                 谢谢大家!我的表演结束!


  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在VS2017中下载和安装Qt插件,可以按照以下步骤进行操作: 1. 打开VS2017,点击菜单栏中的“工具”,然后选择“扩展与更新”。 2. 在弹出的窗口中,选择“联机”选项卡,并搜索“Qt Visual Studio Tools”。 3. 在搜索结果列表中,找到“Qt Visual Studio Tools”并点击下载。如果无法下载,可以在网上搜索并手动下载插件。 4. 下载完成后,按照提示进行安装。安装完成后,需要重新启动VS2017。 5. 重新启动后,可以在VS2017的菜单栏中看到“Qt VS Tools”选项。 安装好Qt插件后,还需要进行一些设置: 1. 点击菜单栏中的“Qt VS Tools”,然后选择“Qt Versions”。 2. 在弹出的对话框中,选择“qt->versions”,然后设置Qt安装目录下bin文件夹的路径。例如,路径可能为:E:\Qt\Qt5.12.2\5.12.2\msvc2017_64\bin。 3. 点击确定按钮完成设置。 至此,你已经成功下载安装了Qt插件并进行了相关设置。现在你可以开始创建第一个关于Qt的程序了。 如果你需要在脱机环境下安装VS2017,请参考\[3\]中提供的链接,该链接提供了关于如何创建VS2017的脱机安装的详细说明。 #### 引用[.reference_title] - *1* *2* [vs2017安装qt插件及安装qt插件后的设置](https://blog.csdn.net/blqzj214817/article/details/127347193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [QT 5.14 和 VS2017脱机离线安装记录](https://blog.csdn.net/stevenkoh/article/details/131044836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值