QtExamples/QtQTreeWidgetEx/ExQTreeWidget.cpp
touwoyimuli 7478bb8f34 feat: QTreeWidget and QDockWidget
QTreeWidget(目录树组件) and QDockWidget(停靠区域组件)的介绍和使用
2019-09-10 22:34:07 +08:00

299 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ExQTreeWidget.h"
#include "ui_ExQTreeWidget.h"
ExQTreeWidget::ExQTreeWidget(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ExQTreeWidget)
{
ui->setupUi(this);
setWindowTitle(QObject::tr("QTreeWidget和QDockWidget的讲解和使用"));
setCentralWidget(ui->scrollArea); //设置scrollArea为中心控件
initTree();
m_labFlie = new QLabel("当前文件的路径:", this);
ui->statusBar->addWidget(m_labFlie);
}
ExQTreeWidget::~ExQTreeWidget()
{
delete ui;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//初始化根节点(只能够有唯一)
void ExQTreeWidget::initTree()
{
//准备工作
ui->treeFiles->clear();
QString dataStr = "";
QIcon icon;
icon.addFile(":/image/Image001.jpg");
//创建唯一root的节点
QTreeWidgetItem* root = new QTreeWidgetItem(treeItemType::itemRoot);
root->setIcon(treeColNum::colItem, icon);
root->setText(treeColNum::colItem, QString("相簿"));
root->setText(treeColNum::colItemType, QString("treeItemType"));
root->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
root->setCheckState(treeColNum::colItem, Qt::Unchecked);
root->setData(treeColNum::colItem, Qt::UserRole, QVariant(dataStr));
//添加顶层节点
ui->treeFiles->addTopLevelItem(root);
}
//添加目录节点
void ExQTreeWidget::addFolderItem(QTreeWidgetItem *parItem, QString dirName)
{
QIcon icon;
icon.addFile(":/image/Image006.jpg");
//添加一个新的节点
QTreeWidgetItem* item = new QTreeWidgetItem(treeItemType::itemFile);
QString folderName = getFinalFolderName(dirName);
item->setIcon(treeColNum::colItem, icon);
item->setText(treeColNum::colItem, folderName);
item->setText(treeColNum::colItemType, QString("treeItemType"));
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
item->setCheckState(treeColNum::colItem, Qt::Unchecked);
item->setData(treeColNum::colItem, Qt::UserRole, QVariant(dirName));
//添加子节点
if (parItem->type() == treeItemType::itemFile) { //若是文件节点
parItem->addChild(item);
} else if (parItem->type() == treeItemType::itemRoot) { //若是唯一root节点
QTreeWidgetItem *root = ui->treeFiles->topLevelItem(0);
root->addChild(item);
}
}
//添加图片节点
void ExQTreeWidget::addImageItem(QTreeWidgetItem *parItem, QString fileName)
{
if (parItem == nullptr)
return;
QIcon icon;
icon.addFile(":/image/Image014.jpg");
//添加一个新的节点
QTreeWidgetItem* item = new QTreeWidgetItem(treeItemType::itemImage);
QString folderName = getFinalFolderName(fileName);
item->setIcon(treeColNum::colItem, icon);
item->setText(treeColNum::colItem, folderName);
item->setText(treeColNum::colItemType, QString("treeItemType"));
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
item->setCheckState(treeColNum::colItem, Qt::Unchecked);
item->setData(treeColNum::colItem, Qt::UserRole, QVariant(fileName));
//添加子节点
if (parItem->type() == treeItemType::itemFile) { //若是文件节点
parItem->addChild(item);
} else if (parItem->type() == treeItemType::itemRoot) { //若是唯一root节点
QTreeWidgetItem *root = ui->treeFiles->topLevelItem(0);
root->addChild(item);
}
}
//从完整的路径里面,获取最后的文件夹名称
QString ExQTreeWidget::getFinalFolderName(const QString &pathName)
{
QString path = pathName;
int cnt = pathName.count();
int i = pathName.lastIndexOf("/");
QString str = pathName.right(cnt - i - 1);
return str;
}
//遍历传进来的父节点下的所有子节点;每遍历过该节点,就在其节点的信息加一个#
void ExQTreeWidget::changeItemCaption(QTreeWidgetItem *parItem)
{
QString str = "# " + parItem->text(treeColNum::colItem);
parItem->setText(treeColNum::colItem, str);
if (parItem->childCount() < 0)
return;
for (int i = 0; i < parItem->childCount(); i++) {
changeItemCaption(parItem->child(i)); //回调,调用自己
}
}
//显示当前item的图片默认以适配高度
void ExQTreeWidget::displayImage(QTreeWidgetItem *item)
{
QString fileName = item->data(treeColNum::colItem, Qt::UserRole).toString();
m_labFlie->setText(fileName);
m_curPixmap.load(fileName); //从文件载入图片
on_actAdaptiveHeight_triggered(); //自动适应高度显示
ui->actAmplification->setEnabled(true);
ui->actShrink->setEnabled(true);
ui->actZoomRealSize->setEnabled(true);
ui->actAdaptiveHeight->setEnabled(true);
ui->actAdaptiveWidth->setEnabled(true);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//增加文件夹
void ExQTreeWidget::on_actAddFolder_triggered()
{
QString path = QFileDialog::getExistingDirectory(); //选择目录
if (! path.isEmpty()) {
QTreeWidgetItem* item = ui->treeFiles->currentItem(); //获取当前节点
if(item != nullptr)
addFolderItem(item, path);
}
}
//添加图片
void ExQTreeWidget::on_actAddFile_triggered()
{
QStringList list = QFileDialog::getOpenFileNames(this, "选择多个将要加载的图片", "", "Images(*.jpg, *.png, *.*)"); //选择目录
if (! list.isEmpty()) {
QTreeWidgetItem* parItem = nullptr;
QTreeWidgetItem* item = ui->treeFiles->currentItem(); //获取当前节点
if (item == nullptr)
return;
if (item->type() == treeItemType::itemImage) { //获得父节点
parItem = item->parent();
} else {
parItem = item;
}
for (int i = 0; i < list.size(); i++) {
QString strName = list.at(i); //获得文件名称
addImageItem(parItem, strName); //添加图片文件到文件节点
}
}
}
//删除节点
void ExQTreeWidget::on_actDeleFile_triggered()
{
QTreeWidgetItem* parItem = nullptr;
QTreeWidgetItem* currItem = ui->treeFiles->currentItem();
if (currItem->type() != treeItemType::itemRoot)
parItem = currItem->parent(); //只能够由其父节点删除
// else
// ui->treeFiles->takeTopLevelItem(0); //删除顶层节点使用这个
if (currItem == nullptr || parItem == nullptr)
return;
parItem->removeChild(currItem); //移除没有从内存中删除所以delete删除
delete currItem;
}
//遍历所有的顶层节点(本处只有一个root顶层节点)
void ExQTreeWidget::on_actScanItems_triggered()
{
for (int i = 0; i < ui->treeFiles->topLevelItemCount(); i++) {
QTreeWidgetItem* currItem = ui->treeFiles->topLevelItem(i); //顶层item
changeItemCaption(currItem);
}
}
//图片自动适应高度
void ExQTreeWidget::on_actAdaptiveHeight_triggered()
{
int height = ui->scrollArea->height(); //得到scrollArea的高度
int realHeight = m_curPixmap.height(); //原始图片的实际高度
m_ratio = height * 1.0 / realHeight; //当前显示比例,必须转换为浮点数
QPixmap pixmap = m_curPixmap.scaledToHeight(height - 50); //图片缩放到指定高度
ui->labDisplay->setPixmap(pixmap); //设置Label的PixMap
}
//图片自动适应宽度
void ExQTreeWidget::on_actAdaptiveWidth_triggered()
{
int width = ui->scrollArea->width();
int realWidth = m_curPixmap.width();
m_ratio = width * 1.0 / realWidth;
QPixmap pixmap = m_curPixmap.scaledToHeight(width - 50);
ui->labDisplay->setPixmap(pixmap);
}
//当前节点变化的时候,自动加载当前图片
void ExQTreeWidget::on_treeFiles_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
if (current != nullptr && previous != nullptr) {
displayImage(current);
}
}
//放大
void ExQTreeWidget::on_actAmplification_triggered()
{
m_ratio *= 1.2; //在当前比例基础上乘以0.8
int height = m_curPixmap.height() * m_ratio; // 显示宽度
int widht = m_curPixmap.width() * m_ratio; // 显示宽度
QPixmap pix = m_curPixmap.scaled(widht, height); //图片缩放到指定高度和宽度,保持长宽比例
ui->labDisplay->setPixmap(pix);
}
//缩小
void ExQTreeWidget::on_actShrink_triggered()
{
m_ratio *= 0.8;
int height = m_curPixmap.height() * m_ratio;
int widht = m_curPixmap.width() * m_ratio;
QPixmap pix = m_curPixmap.scaled(widht, height);
ui->labDisplay->setPixmap(pix);
}
//还原
void ExQTreeWidget::on_actZoomRealSize_triggered()
{
m_ratio = 1;
int height = m_curPixmap.height();
int widht = m_curPixmap.width();
QPixmap pix = m_curPixmap.scaled(widht, height);
ui->labDisplay->setPixmap(pix);
}
//设置Dock窗口是否浮动
void ExQTreeWidget::on_actDockFloating_triggered(bool check)
{
ui->dockWidget->setFloating(check);
}
//设置Dock窗口是否隐藏不显示
void ExQTreeWidget::on_actDockVisible_triggered(bool checked)
{
ui->dockWidget->setVisible(!checked);
}
//退出
void ExQTreeWidget::on_actQiut_triggered()
{
close();
}
//单击DockWidget组件的标题栏的关闭按钮时候会隐藏在停靠区域并且发射信号visibilityChanged; 停靠区域可见性变化
void ExQTreeWidget::on_dockWidget_visibilityChanged(bool visible)
{
ui->actDockVisible->setChecked(visible);
}
//当拖动DockWidget组件使其浮动或者停靠时候会发射信号topLevelChanged; 更新其Action的状态
void ExQTreeWidget::on_dockWidget_topLevelChanged(bool topLevel)
{
ui->actDockFloating->setChecked(topLevel);
}