Как передавать данные между методами в Qt?

Рейтинг: 3Ответов: 1Опубликовано: 04.05.2015

Имеется вот такой код:

#include "dialog.h"
#include "ui_dialog.h"
#include <QtCore>
#include <QFileDialog>

Dialog::Dialog(QWidget* parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::doTask(int& number, QString& ip, int& pt)
{
    QNetworkAccessManager manager;
    QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());

    QNetworkRequest request(QUrl(ui->url->text()));
    reply = manager.get(request);

    QEventLoop loop;
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();

    QString source;
    source.append(QString::fromLocal8Bit(reply->readAll()));

    if (source.contains(ui->search->text(), Qt::CaseInsensitive))
    {
        qDebug() << "Okay.";
    }
    else
    {
        qDebug() << ">>> BAD <<<";
    }

    qDebug() << "TaskID: " << number;
    qDebug() << "IP: " << ip;
    qDebug() << "Port: " << pt;
    qDebug() << "MS: " << ui->wait->value();
    QThread::currentThread()->msleep(ui->wait->value());
    qDebug() << "Processing " << " - "" of thread: " << QThread::currentThreadId();
    qDebug() << "Stopped ";
}

void Dialog::on_pushButton_clicked()
{
    QVector<int> vector;
    for (int i = 0; i < ui->spinBox->value(); i++)
    {
        vector.append(i);
    }

    QProgressDialog pdialog("", "", 0, 100, this, Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowTitleHint | Qt::CustomizeWindowHint);
    pdialog.setLabelText("Processing..");
    pdialog.setCancelButtonText("Stop");

    QFutureWatcher<void> watcher;

    connect(&pdialog,SIGNAL(canceled()), &watcher,SLOT(cancel()));
    connect(&watcher, SIGNAL(finished()), &pdialog, SLOT(reset()));
    connect(&watcher,SIGNAL(progressRangeChanged(int,int)), &pdialog,SLOT(setRange(int,int)));
    connect(&watcher, SIGNAL(progressValueChanged(int)), &pdialog,SLOT(setValue(int)));

    QThreadPool::globalInstance()->setMaxThreadCount(ui->spinBox_2->value());

    QString ip;
    int pt;
    auto q_future = QtConcurrent::map(vector, [this, &ip, &pt](int& number)
                                      {
                                          ip = "127.0.0.1";
                                          pt = 80;
                                          doTask(number, ip, pt);
                                      });

    watcher.setFuture(q_future);

    pdialog.exec();
    watcher.waitForFinished();

    if (watcher.isCanceled())
    {
        qDebug() << "canceled!!!";
        QMessageBox::critical(this, "Canceled", "You clicked cancel!");
    }
    else
    {
        qDebug() << "finished!!!";
        QMessageBox::information(this, "finished", "All done!");
    }
}

void Dialog::on_proxy_clicked()
{
    auto proxy = QFileDialog::getOpenFileName(nullptr,
                                              QObject::tr("Add proxy"),
                                              QCoreApplication::applicationDirPath(),
                                              QObject::tr("Text file (*.txt)"));

    if (true == proxy.isEmpty())
    {
        QMessageBox::critical(nullptr, "Warning", "Empty path proxy list.");
        return; // передумали
    }
    QFile file(proxy);

    QString n;
    if (file.open(QIODevice::ReadOnly))
        n = QTextStream(&file).readAll();

    QRegExp rx("[\:\;]");
    QRegExp rx2("[\r\n]");

    QString str(n);

    QList<QStringList> result;
    foreach(const QString &lst1, str.split(rx2, QString::SkipEmptyParts))
        result << lst1.split(rx);

    ui->cproxy->setNum(result.count());
}

но не совсем ясно как передать данные из result (on_proxy_clicked()) в метод on_pushButton_clicked для дальнейшей обработки (перебор ip и port (pt) )

Какое решение посоветуете в коде?

P.S. Просто прокси чекер.

Ответы

▲ 2Принят

Как вариант, можно слот on_pushButton_clicked() дополнить аргументом, имеющим значение по умолчанию. Получится что-то вроде такого в объявлении:

void on_pushButton_clicked(const QList<QStringList> &result = QList<QStringList>());

... и

void Dialog::on_pushButton_clicked(const QList<QStringList> &result) {...}

... в реализации.

Таким образом, сохраняется возможность вызывать слот по кнопке, а также появляется средство передачи в него списка данных.