Сохранение скриншота работы в Qt C++

128
15 октября 2021, 20:50

Помогите пожалуйста. У меня есть одна проблема, мне нужно сохранить результаты работы в программе в виде скриншота в папку, где находиться сама программа.

Вот main.cpp:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    QScreen *screen = qApp->primaryScreen();
    int x = screen->virtualGeometry().width() / 2 - w.width() / 2;
    int y = screen->virtualGeometry().height() / 2 - w.height() / 2;
    w.setGeometry(x, y, 600, 300);
    w.show();
    QDir::setCurrent(QCoreApplication::applicationDirPath());
    return a.exec();
}

Вот эта строчка определяет путь, где должны создаваться папки, по пути выполнения программы:

QDir::setCurrent(QCoreApplication::applicationDirPath());

Вот как должны создаваться папки:

void MainWindow::hiding()
{
    QDir dir;
    dir.mkpath("./Results/");
    dir.mkdir("9 А");
    l_name1.mkpath("./Results/9 А/");
    l_name1.mkdir(ui->l9_1->text());
    saveSettings();
}
void MainWindow::on_start_2_clicked()
{
    QString dir("./Results/");
    QUrl url = QUrl::fromLocalFile(dir);
    QDesktopServices::openUrl(url);    
}

Ну и сам скриншот:

   grab().save("./Results/9 А/Л1 Складання та випробування електромагніту/" + name->value("names",  ui->textEdit->toPlainText()).toString() + "Завдання 2.png");

Но оно вместо того, чтобы создавать папку за папкой, делает вот что(три пустые папки):

Answer 1

Используйте mkpath, только в качестве аргумента укажите полный путь который необходимо создать:

QString path = "./Results/9 А/Л1 Складання та випробування електромагніту/";
QDir dir;
if( dir.mkpath(path) ) {
    // mkpath - вернет true даже если путь уже существует
    //Если все хорошо, то сохраняем файлы по этому пути
    grab().save(path + "<prefix>_Zavdannya_2.png");
} else {
    // Хьюстон, у нас проблемы...
}

Если же вам необходимо "задерживаться на этажах" ваших папок, то тогда после создания папки в нее необходимо войти:

QDir dir;
dir.mkdir(dirName);
dir.cd(dirName);
// делаем что-то очень важное в папке и создаем новую, вложенную
dir.mkdir(dirName2);

Теперь новые папки будут создаваться (при помощи объекта dir) внутри, то есть относительно директории dirName и так далее...

p.s. в качестве рекомендации, лучше в качестве имен папок и файлов использовать латиницу (можно и транслит) и пробелы заменять на знак подчеркивания _.

READ ALSO
Ошибка при объявлении int - &quot;initializer element is not constant&quot;

Ошибка при объявлении int - "initializer element is not constant"

Начал изучать язык СиПытаюсь скомпилировать простенькую программку, и выбивает такую ошибку

267
Свайп в jquery, библиотека jquery.mobile

Свайп в jquery, библиотека jquery.mobile

В общем дело такое, мне надо отследить свайп, я решил использовать jquerymobile

97