Russian Qt Forum

Qt => Вопросы новичков => Тема начата: fedotok от Декабрь 21, 2012, 21:32



Название: unZip выбранного файла
Отправлено: fedotok от Декабрь 21, 2012, 21:32
как мне связать открытие файла, и разархивиование через 7z.

Код:
.............
void ComicView::on_actionOpen_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(
                this, tr("Open File"),"", tr("Files (*.cbz)"));

    if (fileName.isEmpty())
            return;
}

Код:
#ifndef UNZIP_H
#define UNZIP_H
#include <QProcess>
#include <QObject>

class UnZip: public QObject
{
    Q_OBJECT
public:
    QProcess unZipproc;
    explicit UnZip(QObject *parent = 0);


public slots:
    void unzipprocess();
};

#endif // UNZIP_H

Код:
#include "unzip.h"
#include <QString>
#include <QStringList>

UnZip::UnZip(QObject *parent) : QObject(parent)
{}

void UnZip::unzipprocess()
{
QStringList list;
list << "e" << filename;
unZipproc.start("7z", list);
}


Название: Re: unZip выбранного файла
Отправлено: kambala от Декабрь 21, 2012, 21:45
Код:
...
if (fileName.isEmpty())
    return;

UnZip unzip;
unzip.setFileName(fileName);
unzip.unzipprocess()
только добавь метод setFileName() в класс UnZip


Название: Re: unZip выбранного файла
Отправлено: fedotok от Декабрь 22, 2012, 14:29
я бы хотел через сигнал

Код:
    .............
    .............
    .............
    void ComicView::on_actionOpen_triggered()
    {
    QString fileName = QFileDialog::getOpenFileName(
    this, tr("Open File"),"", tr("Files (*.cbz)"));
    if (fileName != "") {
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly)) {
    QMessageBox::critical(this, tr("Error"), tr("Could not open file"));
    return;
    }
     
    emit signal_unzip_file(fileName);
    }
    }

Код:
    #ifndef UNZIP_H
    #define UNZIP_H
    #include <QProcess>
    #include <QObject>
     
    class UnZip: public QObject
    {
    Q_OBJECT
    public:
    QProcess unZipproc;
    explicit UnZip(QObject *parent = 0);
     
     
    public slots:
    void unzipfile(QString filename);
    };
     
    #endif // UNZIP_H

Код:
    #include "unzip.h"
    #include <QString>
    #include <QStringList>
     
    UnZip::UnZip(QObject *parent) : QObject(parent)
    {}
     
    void UnZip::unzipfile(QString filename)
    {
    QStringList list;
    list << "e" << filename;
    unZipproc.startDetached("7z", list);
    }

вот только я путаюсь как и в какхи заголовочниках прописать сигналы слоты и методы
посмотрите вложение


Название: Re: unZip выбранного файла
Отправлено: kambala от Декабрь 22, 2012, 15:25
написано правильно, надо только сконнектить сигнал и слот.

если плохо разбираешься в сигналах/слотах, читай документацию и/или книги.


Название: Re: unZip выбранного файла
Отправлено: fedotok от Декабрь 22, 2012, 17:53
после просмотра\прочтения кучи простых однотипных примеров я имею

comicview.h
Код:
signals:
    void signal_unzip_file(QString filename);

comicview.cpp
Код:
ComicView::ComicView(QWidget *parent) :
...........
{
    .........
    connect(this, SIGNAL(signal_unzip_file(QString)), &m_unzip, SLOT(unzipfile(QString)));
}

unZip.h
Код:
public slots:
    void unzipfile(QString filename);

и немогу понять как объявить m_unzip в comicview.h и comicview.cpp


Название: Re: unZip выбранного файла
Отправлено: fedotok от Декабрь 22, 2012, 19:42
разобрался

добавил в comicviev.h

Код:
#include "unzip.h"
.........
.........

private
UnZip m_zip;



Название: Re: unZip выбранного файла
Отправлено: fedotok от Декабрь 22, 2012, 20:37
появилась такая проблема
переписал разархивирование вот так

Код:
void UnZip::unzipfile(QString filename)
{
    QString program = "/7-Zip/7z.exe";
    QStringList list;
    list << "x" << filename << "-oc:\comictemp" << "-r";
    unZipproc.startDetached(program, list);

}

командная строка выскакивает, происходит там какойто процесс. но папка comictemp не появляется. При этом если ввести туже команду в еомандную строку вручную, то все проходит нормально

понял ошибку, программа не верно воспринимала одиночный слеш. добавление второго все исправило


Название: Re: unZip выбранного файла
Отправлено: kambala от Декабрь 22, 2012, 21:39
если ты можешь вызвать метод у объекта в нужный момент напрямую как в данном случае (просто m_zip.unzipfile(fileName) вместо твоего эмита), то не нужно городить эти сигналы и слоты


Название: Re: unZip выбранного файла
Отправлено: fedotok от Декабрь 23, 2012, 06:27
вопрос такой.

возможно ли мне как нибудь отловить что разархивировало без ошибок?

и все архивы имеют такую структуру - внутри архива папка с файлами. как мне узнать имя этой папки?


Название: Re: unZip выбранного файла
Отправлено: carrygun от Декабрь 23, 2012, 10:04
вопрос такой.

возможно ли мне как нибудь отловить что разархивировало без ошибок?

и все архивы имеют такую структуру - внутри архива папка с файлами. как мне узнать имя этой папки?
1. Читать стандартный вывод, туда должен вроде выводиться результат. по крайней мере неудачный 7z вроде сыпет.
2. Как вариант смотреть список папок до и полсе разархивации.


Название: Re: unZip выбранного файла
Отправлено: fedotok от Декабрь 23, 2012, 19:04
Код:
void UnZip::unzipfile(QString filename)
{
    QDir dir("/comictemp/");
    uint dirCountBefore = dir.count();

    QString program = "/7-Zip/7z.exe";
    QStringList list;
    list << "x" << filename << "-oc:\\comictemp" << "-r";
    unZipproc.startDetached(program, list);

    if (!(dir.count() - dirCountBefore)>0) { //ошибка
        // ................
        return;
    }

QFileInfoList dirContent = dir.entryInfoList(QStringList()); // <- ошибка
    emit signal_unzip_done(QString dirContent);
}


 пытаюсь вытащить название папки и передать его
 ошибка: expected primary-expression before 'dirContent'