QT+VS照片管理器

该文介绍了使用Qt进行界面设计,涉及QLabel控件展示图片并实现放大、缩小功能,以及QTreeWidget控件展示文件夹目录,利用QTreeWidgetItem进行增删操作。重点在于通过递归函数构建目录树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、界面UI设计

 2、代码

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_test4_7.h"
#include<QTreeWidgetItem>
#include<QFileDialog>
#include<qDebug>
#include<QFileInfoList>
#include<QPicture>

class test4_7 : public QMainWindow
{
	Q_OBJECT

public:
	test4_7(QWidget *parent = Q_NULLPTR);

private:
	Ui::test4_7Class ui;
	void InitUI();
	void InitConnect();
	void p(QTreeWidgetItem *item_2, QFileInfoList list_info);
	
private:
	QIcon ic;
	QIcon ic_1;
	QTreeWidgetItem *item1;
	QList<QTreeWidgetItem*> list_item;
	QPixmap pi;
	bool de;
	QPixmap pi_big;
	QPixmap pi_small;
	QPixmap pi1;

	private slots:
	void on_add();
	void on_addfile();
	void on_delete_2();
	void on_big();
	void on_doubleClick(QTreeWidgetItem *item, int column);
	void on_small();
	void on_exit();
	void on_width();
	void on_hight();
	void on_true_2();
};
#include "test4_7.h"

test4_7::test4_7(QWidget *parent)
	: QMainWindow(parent),
	de(false)
{
	ui.setupUi(this);
	InitUI();
	InitConnect();
}

void test4_7::InitUI()
{
	ui.dockWidget->setWidget(ui.treeWidget);
	ui.treeWidget->setColumnCount(2);
	ui.treeWidget->setHeaderLabels(QStringList()<< QStringLiteral("节点") << QStringLiteral("节点类型"));
	item1 = new QTreeWidgetItem(QStringList()<<QStringLiteral("图片文件"));
	ic_1.addFile(":/test4_7/Resources/picture/file.png");
	ic.addFile(":/test4_7/Resources/picture/picture.png");
	item1->setIcon(0, ic_1);
	ui.treeWidget->addTopLevelItem(item1);
}

void test4_7::InitConnect()
{
	connect(ui.add, SIGNAL(triggered()), this, SLOT(on_add()));
	connect(ui.addfile, SIGNAL(triggered()), this, SLOT(on_addfile()));
	connect(ui.delete_2, SIGNAL(triggered()), this, SLOT(on_delete_2()));
	connect(ui.big, SIGNAL(triggered()), this, SLOT(on_big()));
	connect(ui.treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(on_doubleClick(QTreeWidgetItem *, int)));
	connect(ui.small, SIGNAL(triggered()), this, SLOT(on_small()));
	connect(ui.exit, SIGNAL(triggered()), this, SLOT(on_exit()));
	connect(ui.width, SIGNAL(triggered()), this, SLOT(on_width()));
	connect(ui.hight, SIGNAL(triggered()), this, SLOT(on_hight()));
	connect(ui.true_2, SIGNAL(triggered()), this, SLOT(on_true_2()));
}

void test4_7::on_add()
{
	de = true;
	QFileDialog file;
	QString path_1=file.getExistingDirectory(this, QStringLiteral("选择路径"),"");
	QDir dr(path_1);
	QFileInfoList list_info = dr.entryInfoList(QDir::AllEntries,QDir::DirsFirst);
	item1->setData(0, Qt::UserRole, QVariant(path_1));
	list_item.append(item1);
	p(item1, list_info);

}

void test4_7::p(QTreeWidgetItem *item_2, QFileInfoList list_info)
{
	foreach(QFileInfo io, list_info)
	{
		if (io.fileName() != "." & io.fileName() != "..")
		{
			if (io.isDir())
			{
				QTreeWidgetItem *item_3 = new QTreeWidgetItem(QStringList() << io.fileName());
				item_3->setIcon(0, ic_1);
				item_3->setData(0, Qt::UserRole, QVariant(io.filePath()));
				list_item.last()->addChild(item_3);
				list_item.append(item_3);
				QDir ir = io.filePath();
				QFileInfoList list_info_1 = ir.entryInfoList(QDir::AllEntries, QDir::DirsFirst);
				p(item_3, list_info_1);
				list_item.removeLast();
			}
			if (io.isFile()) 
			{
				QTreeWidgetItem *item_4 = new QTreeWidgetItem(QStringList() << io.fileName());
				item_4->setIcon(0, ic);
				item_4->setData(0, Qt::UserRole, QVariant(io.filePath()));
				item_2->addChild(item_4);
			}
		}

	}		
}

void test4_7::on_addfile()
{
	de = true;
	QFileDialog file;
	QStringList path_1 = file.getOpenFileNames(this, QStringLiteral("选择文件"), "", "All(*.*);;image(*.png);;image(*.jpg);;image(*.jpeg)");
	foreach(QString i, path_1)
	{
		QFileInfo f(i);
		QTreeWidgetItem *item_4 = new QTreeWidgetItem(QStringList()<<f.fileName());
		item_4->setIcon(0, ic);
		item_4->setData(0, Qt::UserRole, QVariant(f.filePath()));
		item1->addChild(item_4);
	}
}

void test4_7::on_delete_2()
{
	if (de)
	{
		QTreeWidgetItem *it = ui.treeWidget->currentItem()->parent();
		it->removeChild(ui.treeWidget->currentItem());
	}
	if (!item1->childCount())
	{
		de = false;
	}
}
void test4_7::on_big()
{
	if (pi_big.width()||pi_small.width())
	{
		if(pi_small.width())
		pi_big = pi_big.scaled(pi_big.width()*1.1, pi_big.height()*1.1);
		pi_small = pi_big;
	}
	else
	{
		pi_big = pi.scaled(pi.width()*1.1, pi.height()*1.1);
	}
	ui.label->setPixmap(pi_big);
}

void test4_7::on_doubleClick(QTreeWidgetItem *item, int column)
{
	pi.load(item->data(0, Qt::UserRole).toString());
	ui.label->setPixmap(pi);
}

void test4_7::on_small()
{
	if (pi_small.width()|| pi_big.width())
	{
		if (pi_big.width())
		{
			pi_small = pi_big;
		}
		pi_small = pi_small.scaled(pi_small.width()*0.9, pi_small.height()*0.9);
		pi_big = pi_small;
	}
	else
	{
		pi_small = pi.scaled(pi.width()*0.9, pi.height()*0.9);
	}
	ui.label->setPixmap(pi_small);
}

void test4_7::on_exit()
{
	de = false;
	while (item1->childCount())
	{
		QTreeWidgetItem *c = item1->child(0);
		item1->removeChild(c);
	}
	ui.label->clear();
	pi=pi.scaled(0, 0);
	pi_big = pi_big.scaled(0, 0);
	pi_small = pi_small.scaled(0, 0);
}

void test4_7::on_width()
{
	pi1 = pi.scaled(ui.label->width(),ui.label->height(), Qt::KeepAspectRatio);
	ui.label->setPixmap(pi1);
}

void test4_7::on_hight()
{
	pi1= pi.scaled(ui.label->width(), ui.label->height(), Qt::KeepAspectRatioByExpanding);
	ui.label->setPixmap(pi1);
}

void test4_7::on_true_2()
{
	ui.label->setPixmap(pi);
}

3、解决方案结构

 4、内容介绍

设计QLabel控件设置图片,使用QPixmap实现;

包括图片放大、缩小功能;

QTreeWidget控件显示文件夹目录,涉及QTreeWidgetItem的增加和删除;

难点在于,目录树的构建,这里使用了一个递归函数来实现。

5、运行效果图

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值