LinuxForum.Fans
Тема

Qt передача данных между классами

Автор: Leviafan 4 сообщений 1501 просмотров
20.10.2014 16:18 #397332

Тут я ищу файлы с определенным расширением и через сигнал-слот записываю в listWidget.
все это происходит в отдельном потоке что бы не было подвисаний

text
void Widget::test0()
{
    QThread *thread = new QThread;  // создаём поток... вначале он создаётся остановленным
 
    MyClass *job = new MyClass; // создаём экземпляр нашего класса
 
    job->moveToThread(thread); // наш класс мы уводим на только что созданный поток... теперь класс будет выполняться независимо от главного окна
 
    connect(thread,SIGNAL(started()),job,SLOT(test())); // когда поток стартует, то начать выполнение работы нашего класса
    connect(job,SIGNAL(finished()),thread,SLOT(quit())); // когда работа будет завершена, завершить поток
    //connect(job,SIGNAL(finished()),job,SLOT(deleteLater())); // когда работа будет завершена, удалить наш экземпляр класса
    connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater())); // когда поток остановится, удалить его
    //connect(job,SIGNAL(sendString(QString)),this,SLOT(reciveString(QString))); // соединить сигнал передачи строки нашего класса со слотом главного окна
    thread->start(); // всё настроено, теперь просто запускаем поток.
 
    connect(job,SIGNAL(sendString(QString)),ui->label,SLOT(setText(QString)));
    connect(job,SIGNAL(sendString(QString)),this,SLOT(copy_filePath(QString)));
}
 
 
void MyClass::test()
{
 
    patch = "/home";
    QDirIterator iterator (patch, QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories);
 
    QTime time;
    time.start();
    while(iterator.hasNext())
    {
 
        iterator.next();
 
        if((iterator.fileInfo().completeSuffix() == "xlsx") ||
           (iterator.fileInfo().completeSuffix() == "xls") ||
           (iterator.fileInfo().completeSuffix() == "txt"))
 
        {
            //ui->listWidget->addItem(iterator.fileInfo().filePath());
 
            QString t =QTime().addMSecs( time.elapsed() ).toString();
 
            emit sendString(iterator.fileInfo().filePath());
            emit sendStringTime(t);
 
        }
    }
 
    emit sendStringTime("ГОТОВО");
    emit finished(); // вызываем сигнал, что мы закончили работу
}

вот в этой строчке я получаю данные из класса MyClass и передаю их в класс Widget

text
connect(job,SIGNAL(sendString(QString)),this,SLOT(copy_filePath(QString)));

потом мне эти данные я хочу тоже запустить в поток что бы окно не зависало, там будут копироваться найденные файлы в определенную папку.
для этого мне надо как то данные из класса Widget передать в новый класс MyClass2
как это можно сделать?
можно ли что то на подобии этого сделать?

text
connect(job,SIGNAL(sendString(QString)),MyClass2,SLOT(copy_filePath(QString)));

ведь this указывает что я передаю в текущий класс. значит можно написать что бы передавались данные и в другой класс?

20.10.2014 18:01 #397337
"Leviafan" написал:
можно ли что то на подобии этого сделать?

да, вроде всё так...
единственное что, вот эти connect'ы:

"Leviafan" написал:
connect(job,SIGNAL(sendString(QString)),ui->label,SLOT(setText(QString)));
connect(job,SIGNAL(sendString(QString)),this,SLOT(copy_filePath(QString)));

должны быть до thread->start();...

21.10.2014 13:01 #397462

ничего не получается
сделал немного по другому

text
void Widget::copy_filePath(QString str)
{
    listfilePath << str;

MyClass_copy listfile; listfile.listfilePath0 << str;

qDebug() << listfile.listfilePath0;

}

в хидере listfilePath0 это QList в классе MyClass_copy

text
class MyClass_copy : public QObject
{
    Q_OBJECT

public: explicit MyClass_copy(QObject *parent = 0);

QSettings *settings; QString patch; QString backup; QList<QString> listfilePath0;

signals: void finished(); // сигнал будем вызвать, когда закончили работу void sendString(QString); // через этот сигнал будем общаться с главным окном

public slots: void copy_Path(); // в этом слоте будут выполняться все действия void copy_filePath2(QString str); //void sendLabel(); };

qDebug() << listfile.listfilePath0; пишет что List заполняется нужными мне данными, но если вызвать

text
void MyClass_copy::copy_Path()
{
    qDebug() << listfilePath0;
    qDebug() << "Hi";

}

то List listfilePath0 пустой.

21.10.2014 13:20 · отредактировано #397468

вроде разобрался, надо было вынести мой класс

text
MyClass_copy listfile;

void Widget::copy_filePath(QString str) { listfilePath << str;

listfile.listfilePath0 << str;

qDebug() << listfile.listfilePath0;

}

и

text
void MyClass_copy::copy_Path()
{
    qDebug() << listfile.listfilePath0;
    qDebug() << "Hi";

}

вроде все заработало

Войдите или зарегистрируйтесь, чтобы ответить.