Я написал программу Qt, в которой генерируются серии графиков, когда пользователь загружает определенный файл данных и нажимает кнопку. Когда кнопка нажата, программа произведет серию расчетов, построит несколько графиков и отобразит их на экране при вызове функции QDialog::exec()
. Чего я пытаюсь добиться, так это grab
скриншотов сгенерированных графиков, используя QWidget::grab()
. По сути, QWidget::grab()
вызывается сразу после QDialog::exec()
. Но поскольку QDialog::exec()
продолжает работать до тех пор, пока пользователь не закроет конкретное окно, вызов QWidget::grab()
после закрытия окна не дает желаемых результатов.
Это часть моего кода;
In mainwindow.cpp
graphWindow.setWindowState(Qt::WindowMaximized);
graphWindow.exec();
graphWindow.savePlots();
In graphWindow.savePlots()
void GraphWindow::savePlots()
{
QStringList plotNames;
plotNames << "Income Statement (Plot A)" << "Income Statement (Plot B)" << "Balance Sheet (Plot A)"
<< "Balance Sheet (Plot B)" << "Cash Flow Plot" << "Holistic Stock Performance";
for(int item = 0; item < ui->graphTab->count(); item++)
{
ui->graphTab->setCurrentIndex(item);
QWidget * currentWidget = ui->graphTab->widget(item);
int height = currentWidget->height();
int width = currentWidget->width();
int x = currentWidget->x();
int y = currentWidget->y();
QRect grabRect(x,y,width,height);
//destImagePath is a global variable
QString imageFilePath = destImagePath;
imageFilePath.append(plotNames.at(item));
imageFilePath.append(".png");
currentWidget->grab(grabRect).save(imageFilePath);
}
//Reset to first tab after grab
ui->graphTab->setCurrentIndex(0);
}
Я думал обойти QDialog::exec()
, запустив еще один QThread
, который выполняет GraphWindow::savePlots()
, пока окно все еще работает, чтобы снимки экрана давали желаемые результаты.
Есть ли лучший способ сделать это? Я думаю, что создание нового QThread
только для вызова одной функции очень неэффективно. Даже если это не так, не могли бы вы объяснить, как это можно реализовать в параллельном QThreads
.
savePlots()
из диалогового окна. Просто сделайте это до закрытия диалога. - person Alexander V   schedule 02.03.2017saveplots()
из диалогового окна? Я знаю, что вы имеете в виду, но не уверен в том, как это реализовать. Было бы очень полезно, если бы вы могли уточнить, пожалуйста? - person Vino   schedule 02.03.2017grab()
работало. Вот почему я позвонилexec()
передsaveplots()
. Я попробую то, что вы сказали. Спасибо. - person Vino   schedule 02.03.2017