Russian Qt Forum
Сентябрь 23, 2024, 14:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: unZip выбранного файла  (Прочитано 5299 раз)
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);
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Декабрь 21, 2012, 21:45 »

Код:
...
if (fileName.isEmpty())
    return;

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
fedotok
Гость
« Ответ #2 : Декабрь 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);
    }

вот только я путаюсь как и в какхи заголовочниках прописать сигналы слоты и методы
посмотрите вложение
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Декабрь 22, 2012, 15:25 »

написано правильно, надо только сконнектить сигнал и слот.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
fedotok
Гость
« Ответ #4 : Декабрь 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
Записан
fedotok
Гость
« Ответ #5 : Декабрь 22, 2012, 19:42 »

разобрался

добавил в comicviev.h

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

private
UnZip m_zip;

« Последнее редактирование: Декабрь 22, 2012, 19:55 от fedotok » Записан
fedotok
Гость
« Ответ #6 : Декабрь 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 не появляется. При этом если ввести туже команду в еомандную строку вручную, то все проходит нормально

понял ошибку, программа не верно воспринимала одиночный слеш. добавление второго все исправило
« Последнее редактирование: Декабрь 22, 2012, 20:54 от fedotok » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #7 : Декабрь 22, 2012, 21:39 »

если ты можешь вызвать метод у объекта в нужный момент напрямую как в данном случае (просто m_zip.unzipfile(fileName) вместо твоего эмита), то не нужно городить эти сигналы и слоты
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
fedotok
Гость
« Ответ #8 : Декабрь 23, 2012, 06:27 »

вопрос такой.

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

и все архивы имеют такую структуру - внутри архива папка с файлами. как мне узнать имя этой папки?
Записан
carrygun
Гость
« Ответ #9 : Декабрь 23, 2012, 10:04 »

вопрос такой.

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

и все архивы имеют такую структуру - внутри архива папка с файлами. как мне узнать имя этой папки?
1. Читать стандартный вывод, туда должен вроде выводиться результат. по крайней мере неудачный 7z вроде сыпет.
2. Как вариант смотреть список папок до и полсе разархивации.
Записан
fedotok
Гость
« Ответ #10 : Декабрь 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'
« Последнее редактирование: Декабрь 23, 2012, 23:02 от fedotok » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.059 секунд. Запросов: 23.