組織任務樹構建
要創建上圖所示的任務列表,包含四種類型:空的佔位項、案件、文件夾、視頻任務;可以創建一個基類,如下圖所示,任務列表有爲了實現四種不同的項,建立一個基類,定義公共的接口;三個不同項繼承這個基類;
(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); } } }