Qtreewidget實現複雜組織樹結構

 組織任務樹構建

 

 

要創建上圖所示的任務列表,包含四種類型:空的佔位項、案件、文件夾、視頻任務;可以創建一個基類,如下圖所示,任務列表有爲了實現四種不同的項,建立一個基類,定義公共的接口;三個不同項繼承這個基類;

 

(1)組織樹基類接口定義

#ifndef TREEITEMBASE_H

#define TREEITEMBASE_H

 

#include <QWidget>

#include<QVariantMap>

 

enum TreeItemType

{

    EmptyItem=-1,

    TopCase=0,

    ChildFolder,

    videoFile

};

class TreeItemBase : public QWidget

{

    Q_OBJECT

 

public:

    TreeItemBase(QWidget *parent = 0);

    ~TreeItemBase();

    virtual void setInfo(QVariantMap info)=0;

    virtual void SetType(TreeItemType type) = 0;//設置是案件、子文件夾、視頻文件

    virtual int GetType()=0;

    virtual bool IsChecked()=0;//是否選中

    virtual void SetChecked(bool checked) = 0;

    virtual void SetFilterHover(QString FilterHover);

    QVariantMap m_info;

    TreeItemType m_type = TopCase;

    QString m_strFilterHover = "";

signals:

    void ItemCheckChange(int checked);

 

   

};

 

 

#endif // TREEITEMBASE_H

 

(2)添加空的案件或者子文件夾

先添加一個空的佔位符,根據類型是案件還是子文件夾,設置不同的圖標,等點擊確認按鈕後,再刪除空的佔位符,添加案件和子文件夾,並將案件或者子文件夾的本地路徑寫入數據庫;

QTreeWidgetItem* TreeTaskList::AddEmptyFoldToList(QTreeWidgetItem* parant /*= NULL*/)

{

    QVariantMap iteminfo;

    iteminfo.insert("type", EmptyItem);

    if (parant == NULL)//添加案件主節點

    {

        QTreeWidgetItem *topItem = new QTreeWidgetItem(ui.treeWidget);

        QString strTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

        topItem->setText(0,strTime);

        topItem->setData(0, 256, iteminfo);

        EmptyTreeItem* pCase = new EmptyTreeItem();

        pCase->SetType(EmptyItem);

        pCase->SetAddType(TopCase);

        topItem->setSizeHint(0, QSize(256, 40));

        ui.treeWidget->setItemWidget(topItem, 0, pCase);

        ui.treeWidget->insertTopLevelItem(0, topItem);

        ui.treeWidget->setCurrentItem(topItem);

        pCase->ui.lineEditName->setFocus();

        connect(pCase->ui.pBConFirm, &QPushButton::clicked, this, [=]() {

            if (pCase->ui.lineEditName->text().trimmed()=="")

            {

                signalError(-1, "請輸入案件名稱");

                return;

            }

            if (AddFoldToList(pCase->ui.lineEditName->text().trimmed())!=NULL)//添加案件

            {

                ui.treeWidget->takeTopLevelItem(ui.treeWidget->indexOfTopLevelItem(topItem));//刪除佔位

            }

        });

        connect(pCase->ui.pBCancel,&QPushButton::clicked, this, [=]() {

            ui.treeWidget->takeTopLevelItem(ui.treeWidget->indexOfTopLevelItem(topItem));//刪除佔位

            SlotUpdateTreeListBackground();

        });

        SlotUpdateTreeListBackground();

        return topItem;

    }

    else//添加文件夾子節點

    {

        QTreeWidgetItem *itemchildforder = new QTreeWidgetItem(parant);

        QString strTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

        itemchildforder->setText(0, strTime);

        itemchildforder->setData(0, 256, iteminfo);

        itemchildforder->setSizeHint(0, QSize(200, 40));

        EmptyTreeItem* childfold = new EmptyTreeItem();

        childfold->SetType(EmptyItem);

        childfold->SetAddType(ChildFolder);

        ui.treeWidget->setItemWidget(itemchildforder, 0, childfold);

        ui.treeWidget->setCurrentItem(itemchildforder);

        childfold->ui.lineEditName->setFocus();

        connect(childfold->ui.pBConFirm, &QPushButton::clicked, this, [=]() {

            if (childfold->ui.lineEditName->text().trimmed() == "")

            {

                signalError(-1, "請輸入子文件夾名稱");

                return;

            }

            if (AddFoldToList(childfold->ui.lineEditName->text().trimmed(), parant) != NULL)//添加案件

            {

                parant->takeChild(parant->indexOfChild(itemchildforder));//刪除佔位

            }

        });

        connect(childfold->ui.pBCancel, &QPushButton::clicked, this, [=]() {

            parant->takeChild(parant->indexOfChild(itemchildforder));//刪除佔位

        });

        return itemchildforder;

    }

    return NULL;

}

 

 

(3)自動遍歷子文件夾裏面的視頻文件和文件夾添加到案件

爲了實現循環遍歷,需要採用遞歸算法來實現這個函數;循環遍歷子文件夾;

void TreeTaskList::RecursiveInputDirFiles(QString strDir,QTreeWidgetItem* parant )

{

    QDir dirFile(strDir);

    QDir dirDir(strDir);

    if (!dirDir.exists())

    {

        return;

    }

   

    dirFile.setSorting(QDir::Time);//優先顯示目錄

    dirDir.setSorting(QDir::Time);

 

    //列出dir(path)目錄文件下所有文件和目錄信息,存儲到file_list容器

    QStringList fileNameFilter;

    //視頻格式

    fileNameFilter <<"*.mp4"<<"*.avi"<<"*.dav"<<"*.asf"<<"*.wmv"<<"*.mpg"<<"*.ts"<<"*.3g2"<<"*.swf"<<"*.flv"<<"*.m2ts"<<"*.mkv"<<"*.3gp"<<"*.vob"<<"*.rmvb"<<"*.mov"<<"*.webm"<<"*.rm"<<"*.mts"<<"*.mpeg"<<"*.264"<<"*.692"<<"*.800"<<"*.801"<<"*.av"<<"*.avx"<<"*.djl"<<"*.dvr"<<"*.g64"<<"*.h3crd"<<"*.h64"<<"*.h264"<<"*.ifv"<<"*.jmv"<<"*.kyd"<<"*.lvf"<<"*.mpk"<<"*.nsf"<<"*.nv4"<<"*.ps"<<"*.rec"<<"*.sdv"<<"*.sv5"<<"*.swf"<<"*.tm4"<<"*.tp"<<"*.bhd"<<"*.dat"<<"*.h265"<<"*.he4"<<"*.m4c"<<"*.pep"<<"*.smf"<<"*.sv4"<<"*.vdg"<<"*.601"<<"*.452094848";

    dirFile.setNameFilters(fileNameFilter);

    QFileInfoList file_list = dirFile.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);

    //列出dir(path)目錄下所有子文件夾

    QFileInfoList folder_list = dirDir.entryInfoList(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot);

    if (file_list.size() == 0 && folder_list.size() == 0)

    {

        return;

    }

    //添加視頻文件到列表

    QString strfilepath = "";

    for (int i = 0; i < file_list.size(); i++)

    {

        strfilepath = file_list[i].absoluteFilePath();

        AddVideoTaskToList(strfilepath, parant);

    }

 

    //進行子文件夾folder_list遞歸遍歷,將內容存入file_list容器

    for (int i = 0; i != folder_list.size(); i++)

    {

        //添加子文件夾

        QString strDirName = folder_list.at(i).fileName();

        if (strDirName=="temp")//自動過濾掉臨時文件夾

        {

            continue;

        }

        QTreeWidgetItem* childFold = AddFoldToList(strDirName,parant);

        //遞歸子文件夾

        if (childFold!=NULL)

        {

            RecursiveInputDirFiles(folder_list.at(i).absoluteFilePath(), childFold);

        }  

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章