Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

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

Имеется вот такой код:
#include "dialog.h" #include "ui_dialog.h" #include #include
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(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 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 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("[
]");
QString str(n);
QList 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. Просто прокси чекер.


Ответ

Как вариант, можно слот on_pushButton_clicked() дополнить аргументом, имеющим значение по умолчанию. Получится что-то вроде такого в объявлении:
void on_pushButton_clicked(const QList &result = QList());
... и
void Dialog::on_pushButton_clicked(const QList &result) {...}
... в реализации.
Таким образом, сохраняется возможность вызывать слот по кнопке, а также появляется средство передачи в него списка данных.

Комментариев нет:

Отправить комментарий