- 使用到:QZZSplitter,QHBoxLayout,QTreeWidget,QTableWidget 四个控件
- 如下图所示:
-
QT5.12 使用中文出现乱码,并编译提示错误:error: C2001: 常量中有换行符
在头文件上添加
#pragma execution_character_set("utf-8")
-
main.cpp 文件内容
-
#include "mainwindow.h"
#include <QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec *codec = QTextCodec::codecForName("UTF-8"); //获取系统编码
QTextCodec::setCodecForLocale(codec);
MainWindow w;
w.show();
return a.exec();
}
DataStructs.h 文件内容:
-
#ifndef DATASTRUCTS_H
#define DATASTRUCTS_H
#include <QString>
#include<QObjectUserData>
typedef struct s_DicTreeData
{
bool isClicked;
bool isRoot;
QString strPath;
s_DicTreeData()
{
isClicked = false;
strPath = "";
isRoot = false;
}
}DicTreeData;
typedef struct s_DicFileData
{
QString strName;
QString strTime;
QString strLastModify;
}DicFileData;
Q_DECLARE_METATYPE(DicTreeData)
#endif // DATASTRUCTS_H
mainwindow.h文件内容:
-
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#pragma execution_character_set("utf-8")
#include <QMainWindow>
#include <QSplitter>
#include <QHBoxLayout>
#include <QTreeWidget>
#include <QTableWidget>
#include <QLabel>
#include <QDir>
#include <QVariant>
#include <QDebug>
#include <QFileIconProvider>
#include <QDateTime>
#include <QHeaderView>
#include <DataStructs.h>
#include "qzzsplitter.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void DirTreeClicked(QTreeWidgetItem *item, int column);
void DirTreeDBClicked(QTreeWidgetItem *item, int column);
void DicTableClicked(QTableWidgetItem *item);
private:
void InitDicTree(); //初始化目录树
void InitDicTable(); //初始化右边发文件表格
void SignalSlotInit(); //信号和槽初始化函数
void AddDicTreeChild(QTreeWidgetItem *item, int column); //在目录树添加子节点
void AddFileList(DicFileData dfd); //添加文件到列表
void BrowFileOfDIC(QTreeWidgetItem *item, int column); //遍历目录下的文件
void RemoveAllRow(); //删除表中所有记录
private:
Ui::MainWindow *ui;
private:
QZZSplitter *m_pMainSplitter;
QZZSplitter *m_pRightSplitter;
QHBoxLayout *m_pMainLayout;
QTreeWidget *m_pDicTree;
QTableWidget *m_pDicTable;
QLabel *m_pFileInfo;
QString m_strPrePath; //上一次遍历的目录路径
QDir m_qLogicDir;
};
#endif // MAINWINDOW_H
mainwindow.cpp文件内容:
-
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle(tr("FileSystemBrowers"));
m_pMainSplitter = new QZZSplitter(Qt::Horizontal);
m_pDicTree = new QTreeWidget(m_pMainSplitter);
m_pRightSplitter = new QZZSplitter(Qt::Vertical, m_pMainSplitter);
m_pDicTable = new QTableWidget(m_pRightSplitter);
m_pFileInfo = new QLabel(m_pRightSplitter);
m_pFileInfo->setText("我是文件信息窗口");
m_pMainSplitter->setStretchFactor(1, 1);
m_pMainLayout = new QHBoxLayout();
m_pMainLayout->addWidget(m_pMainSplitter);
InitDicTree();
InitDicTable();
SignalSlotInit();
this->centralWidget()->setLayout(m_pMainLayout); //在MainWindow 窗口中需要调用这样调用来设置
}
void MainWindow::SignalSlotInit()
{
connect(m_pDicTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int )), this, SLOT(DirTreeDBClicked(QTreeWidgetItem *, int )));
connect(m_pDicTree, SIGNAL(itemClicked(QTreeWidgetItem *, int )), this, SLOT(DirTreeClicked(QTreeWidgetItem *, int )));
connect(m_pDicTable, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(DicTableClicked(QTableWidgetItem *)));
}
void MainWindow::DirTreeClicked(QTreeWidgetItem *item, int column)
{
QVariant var= item->data(column, Qt::UserRole);
DicTreeData dtd = var.value<DicTreeData>();
if(!dtd.isClicked)
{
dtd.isClicked = true;
var=QVariant::fromValue(dtd);
item->setData(0, Qt::UserRole, var);
//qDebug()<<dtd.strPath<<endl;
AddDicTreeChild(item, column); //遍历目录
}
if(!dtd.isRoot)
{
BrowFileOfDIC(item, column); //遍历文件
}
if(!item->isExpanded())
{
item->setExpanded(true);
}
else
{
item->setExpanded(false);
}
}
void MainWindow::DirTreeDBClicked(QTreeWidgetItem *item, int column)
{
}
void MainWindow::DicTableClicked(QTableWidgetItem *item)
{
QList<QTableWidgetItem*> items = m_pDicTable->selectedItems();
QString strName = items.at(0)->text();
strName = m_strPrePath + strName;
m_pFileInfo->setText(strName);
//qDebug()<<m_strPrePath<<strName;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::InitDicTree()
{
m_pDicTree->clear();
m_pDicTree->setHeaderHidden(true);
QFileIconProvider fileIconProvider;
DicTreeData dtd;
QVariant vdtd;
dtd.isClicked = true;
dtd.isRoot = true;
vdtd=QVariant::fromValue(dtd);
QTreeWidgetItem *pRootItem = new QTreeWidgetItem(m_pDicTree);
QString strValue= tr("计算机");
pRootItem->setText(0, strValue);
pRootItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
pRootItem->setIcon(0,fileIconProvider.icon(QFileIconProvider::Computer));
pRootItem->setData(0, Qt::UserRole, vdtd);
pRootItem->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
QTreeWidgetItem *pItem = NULL;
dtd.isClicked = false;
dtd.isRoot = false;
foreach(QFileInfo fileInfo, m_qLogicDir.drives())
{
pItem =new QTreeWidgetItem(pRootItem);
dtd.strPath = fileInfo.absoluteFilePath();
vdtd=QVariant::fromValue(dtd);
pItem->setText(0, dtd.strPath.replace(2,1,'\\'));
pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
pItem->setData(0, Qt::UserRole, vdtd);
pItem->setIcon(0, fileIconProvider.icon(QFileIconProvider::Drive));
pItem->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator); //显示左边三角形
}
}
void MainWindow::InitDicTable()
{
m_strPrePath = "";
QTableWidgetItem *pItem = NULL;
QStringList headerList;
headerList<<"文件名"<<"创建时间"<<"最后修改时间";
m_pDicTable->setColumnCount(headerList.count());
for (int i = 0; i < m_pDicTable->columnCount() ; i++)
{
pItem = new QTableWidgetItem(headerList.at(i));
m_pDicTable->setHorizontalHeaderItem(i, pItem);
}
//设置列宽自适应
m_pDicTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_pDicTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
m_pDicTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_pDicTable->setSelectionBehavior(QAbstractItemView::SelectRows);
m_pDicTable->setAlternatingRowColors(true);
m_pDicTable->setRowCount(0);
}
void MainWindow::AddDicTreeChild(QTreeWidgetItem *item, int column)
{
QTreeWidgetItem *PRoot = item;
QFileIconProvider fileIconProvider;
QTreeWidgetItem *pItem = NULL;
DicTreeData dtdSubDic;
QVariant vdtd;
QVariant var= item->data(column, Qt::UserRole);
DicTreeData dtd = var.value<DicTreeData>();
QString strPath = dtd.strPath;
if(dtd.strPath.right(1) != '/')
{
strPath = strPath +'/';
}
QDir tmpDir(strPath);
DicFileData dfd;
foreach(QFileInfo fileInfo, tmpDir.entryInfoList())
{
if(fileInfo.isDir() && fileInfo.fileName().compare(".") && fileInfo.fileName().compare("..")) //目录添加到目录树上
{
pItem =new QTreeWidgetItem(PRoot);
dtdSubDic.strPath = fileInfo.absoluteFilePath();
vdtd=QVariant::fromValue(dtdSubDic);
pItem->setText(0, fileInfo.fileName());
pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
pItem->setData(0, Qt::UserRole, vdtd);
pItem->setIcon(0, fileIconProvider.icon(QFileIconProvider::Folder));
pItem->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);//显示左边三角形
//qDebug()<<fileInfo.fileName()<<endl;
}
}
}
void MainWindow::BrowFileOfDIC(QTreeWidgetItem *item, int column)
{
DicTreeData dtdSubDic;
QVariant vdtd;
QVariant var= item->data(column, Qt::UserRole);
DicTreeData dtd = var.value<DicTreeData>();
QString strPath = dtd.strPath;
if(dtd.strPath.right(1) != '/')
{
strPath = strPath +'/';
}
if(m_strPrePath.compare(strPath))
{
m_strPrePath = strPath;
QDir tmpDir(strPath);
DicFileData dfd;
RemoveAllRow();
foreach(QFileInfo fileInfo, tmpDir.entryInfoList())
{
if(fileInfo.isFile())//文件添加到右边列表中
{
//文件添加到右边list控件中
dfd.strName = fileInfo.fileName();
dfd.strTime = fileInfo.birthTime().toString("yyyy-MM-dd hh:mm:ss");
dfd.strLastModify = fileInfo.lastModified().toString("yyyy-MM-dd hh:mm:ss");
AddFileList(dfd);
}
}
}
}
void MainWindow::AddFileList(DicFileData dfd)
{
//m_pDicTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
int iCurRow = m_pDicTable->rowCount();
m_pDicTable->insertRow(iCurRow);
m_pDicTable->setItem(iCurRow, 0, new QTableWidgetItem(dfd.strName));
m_pDicTable->setItem(iCurRow, 1, new QTableWidgetItem(dfd.strTime));
m_pDicTable->setItem(iCurRow, 2, new QTableWidgetItem(dfd.strLastModify));
}
void MainWindow::RemoveAllRow()
{
int iRowCount = m_pDicTable->rowCount();
for (int i = 0; i <= iRowCount ;i++)
{
m_pDicTable->removeRow(i);
}
m_pDicTable->setRowCount(0);
}
-
qzzsplitter.h文件内容:
-
#ifndef QZZSPLITTER_H
#define QZZSPLITTER_H
#include <QSplitter>
class QZZSplitter : public QSplitter
{
Q_OBJECT
public:
QZZSplitter(QWidget *parent = nullptr);
QZZSplitter(Qt::Orientation orientation, QWidget *parent = nullptr);
};
#endif // QZZSPLITTER_H
-
qzzsplitter.cpp 文件内容:
-
#include "qzzsplitter.h"
QZZSplitter::QZZSplitter(QWidget *parent)
: QSplitter(parent)
{
}
QZZSplitter::QZZSplitter(Qt::Orientation orientation, QWidget *parent)
:QSplitter(orientation, parent)
{
}