#include "CopyDatFile.h" #include "ui_CopyDatFile.h" #include #include "NetMgr.h" #include #ifdef _WIN32 #include #include #else #include #include #include #include #endif static const QString kUpItem = "__UP__"; CCopyDatFile::CCopyDatFile(QWidget *parent) : QWidget(parent), ui(new Ui::CCopyDatFile) { ui->setupUi(this); ui -> treeWidget_fileList -> setRootIsDecorated(false); ui -> treeWidget_fileList -> setHeaderLabels(QStringList() << tr("名字") << tr("大小(KB)") << tr("拥有者") << tr("所属组") << tr("时间")); ui -> treeWidget_dist -> setHeaderLabels(QStringList() << tr("名字") << tr("大小(KB)") << tr("拥有者") << tr("所属组") << tr("时间")); ui->treeWidget_fileList->header()->setSectionResizeMode(QHeaderView::ResizeToContents); ui -> treeWidget_fileList -> header() ->setStretchLastSection(false); ui->treeWidget_dist->header()->setSectionResizeMode(QHeaderView::ResizeToContents); ui -> treeWidget_dist -> header() ->setStretchLastSection(false); ui->treeWidget_fileList->setContextMenuPolicy(Qt::CustomContextMenu); QObject::connect(ui->treeWidget_fileList ,SIGNAL(customContextMenuRequested(const QPoint &)),this,SLOT(on_treeWidget_customContextMenuRequested(const QPoint &))); connect(ui->treeWidget_dist, &QTreeWidget::itemActivated,this, &CCopyDatFile::processItem); connect(ui->treeWidget_fileList, &QTreeWidget::itemDoubleClicked, this, &CCopyDatFile::onItemDoubleClicked); ui->label_path->setText("/run/media/"); connectToFtp(); } CCopyDatFile::~CCopyDatFile() { scp.disconnectFromHost(); delete ui; } void CCopyDatFile::connectToFtp() { bool res = scp.connectToHost("192.168.0.102", 22, "root", "@#cidw!@123456"); if(!res){ QMessageBox::information(this, QStringLiteral("提示"), "连接失败!"); return; } QString path = "/opt/"; QVector files ; scp.listRemoteDir(path,files); fillTreeWidget(ui->treeWidget_fileList, files, path); } void CCopyDatFile::ftpCommandFinished(int, bool error) { // qDebug() << ftp->currentCommand() <currentCommand() == QFtp::ConnectToHost) // { // if (error) { // return; // } // else { // return; // } // } // if (ftp->currentCommand() == QFtp::Login){ // qDebug() << "连接成功!" << endl; // ftp -> cd("/var/www/html/cidwdat/"); // ftp->list(); // } // if (ftp->currentCommand() == QFtp::Get) { // if (error) { // } else { // } // } else if (ftp->currentCommand() == QFtp::List) { // qDebug() << "List" << endl; // } } static QString permToString(uint perm) { QString s; s += (perm & 0400) ? "r" : "-"; s += (perm & 0200) ? "w" : "-"; s += (perm & 0100) ? "x" : "-"; s += (perm & 0040) ? "r" : "-"; s += (perm & 0020) ? "w" : "-"; s += (perm & 0010) ? "x" : "-"; s += (perm & 0004) ? "r" : "-"; s += (perm & 0002) ? "w" : "-"; s += (perm & 0001) ? "x" : "-"; return s; } void CCopyDatFile::fillTreeWidget( QTreeWidget *tree, const QVector &files, const QString ¤tPath) { tree->clear(); QTreeWidgetItem *up = new QTreeWidgetItem; up->setText(ColName, ".."); up->setText(ColType, "Dir"); up->setIcon(ColName, QIcon(":/icons/up.png")); //up->setData(ColName, Qt::UserRole, kUpItem); ui->treeWidget_fileList->addTopLevelItem(up); for (const auto &f : files) { QTreeWidgetItem *item = new QTreeWidgetItem(tree); item->setText(ColName, f.name); item->setText(ColSize, f.isDir ? "" : QString::number(f.size)); item->setText(ColType, f.isDir ? "Dir" : "File"); item->setText(ColPerm, permToString(f.permissions)); item->setText(ColOwner, f.owner); item->setText(ColGroup, f.group); item->setText(ColModified, f.lastModified.toString("yyyy-MM-dd HH:mm:ss")); item->setData(ColName, Qt::UserRole, f.name); // 📁 目录加图标 if (f.isDir) { item->setIcon(ColName, QApplication::style()->standardIcon(QStyle::SP_DirIcon)); // 标记可展开(即使还没加载) item->setChildIndicatorPolicy( QTreeWidgetItem::ShowIndicator); } else { item->setIcon(ColName, QApplication::style()->standardIcon(QStyle::SP_FileIcon)); } // 存远程完整路径(关键) QString fullPath = currentPath; if (!fullPath.endsWith('/')) fullPath += '/'; fullPath += f.name; item->setData(ColName, Qt::UserRole, fullPath); } } void CCopyDatFile::on_pushButton_refresh_clicked() { QString path = "/opt/"; QVector files ; scp.listRemoteDir(path,files); fillTreeWidget(ui->treeWidget_dist, files, path); QString path_dist = "/run/media"; } void CCopyDatFile::onItemDoubleClicked(QTreeWidgetItem *item, int column) { if (item->text(ColType) != "Dir") return; QString path = item->data(ColName, Qt::UserRole).toString(); QVector files ; scp.listRemoteDir(path,files); fillTreeWidget(ui->treeWidget_fileList, files, path); ui->treeWidget_fileList->setProperty("currentPath", path); ui->label_path->setText(path); } void CCopyDatFile::processItem(QTreeWidgetItem *item, int /*column*/) { } void CCopyDatFile::slotCopyItem() { QTreeWidgetItem *item = ui->treeWidget_fileList->currentItem(); //获取光标所在位置的Item QString str = item->data(0, Qt::UserRole).toString(); qDebug() << str << item << endl; QJsonObject allObj,cmdBody; allObj.insert("cmd", "100"); cmdBody.insert("subcmd",1); cmdBody.insert("srcfile",str); cmdBody.insert("dstdirectory",m_strDistPath); allObj["cmdBody"] = cmdBody; QNetworkRequest req; QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP); req.setUrl(sUrl); g_NetMgr->PostJson(req,allObj); } void CCopyDatFile::on_treeWidget_customContextMenuRequested(const QPoint &pos) { int iCount = ui->treeWidget_dist->topLevelItemCount(); if(iCount <= 0) return; QMenu menu; copyAction = new QAction("复制"); connect(copyAction, &QAction::triggered, this, &CCopyDatFile::slotCopyItem, Qt::UniqueConnection); menu.addAction(copyAction); menu.exec(QCursor::pos()); //显示菜单 } void CCopyDatFile::on_pushButton_exit_clicked() { QJsonObject allObj,cmdBody; allObj.insert("cmd", "100"); cmdBody.insert("subcmd",3); cmdBody.insert("dstdirectory",m_strDistPath); allObj["cmdBody"] = cmdBody; QNetworkRequest req; QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP); req.setUrl(sUrl); g_NetMgr->PostJson(req,allObj); }