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、运行效果图