Подскажите как правильно разместить функцию QFileDialog::getOpenFileNames внутри оператора try в C++
Подскажите пожалуйста, почему происходит аварийное завершение программы, если внутри оператра помещена только функция QStringList fileName = QFileDialog::getOpenFileNames.... Я хотел оставить внутри try только присваивание значений имен файлов fileName, а остальное выполнить после оператора try.
void MainWindow::on_pushButton_1_clicked() // open_file
{
QStringList fileName;
try {
QStringList fileName = QFileDialog::getOpenFileNames(this, tr("Open Files"), QDir::currentPath(), tr("Audio Files: *.mp3, *.flac, *.wav,"
" *.ape, *.aac, *.ac3, *.dff, *.dts,"
" *.ogg, *.m4a, *.mkv, *.iso (*.mp3"
" *.flac *.wav *.ape *.aac *.ac3 *.dff"
" *.dts *.ogg *.m4a *.mkv *.iso);;All files (*.*)"));
} catch (...) {
g_message = "One of files cannot be opened.";
Taskcomplete taskcomplete;
taskcomplete.setModal(true);
taskcomplete.exec();
return;
};
if (fileName.isEmpty())
{
return;
} else {
QString file_name = fileName.at(0);
std::string file_0 = file_name.toUtf8().constData();
std::cout << "" << file_0 << std::endl;
}
}
Если же внутри оператора try поместить другие операторы, которые работают с полученным значением fileName, то программа работает корректно. Вот работающий код:
void MainWindow::on_pushButton_1_clicked() // open_file
{
try {
QStringList fileName = QFileDialog::getOpenFileNames(this, tr("Open Files"), QDir::currentPath(), tr("Audio Files: *.mp3, *.flac, *.wav,"
" *.ape, *.aac, *.ac3, *.dff, *.dts,"
" *.ogg, *.m4a, *.mkv, *.iso (*.mp3"
" *.flac *.wav *.ape *.aac *.ac3 *.dff"
" *.dts *.ogg *.m4a *.mkv *.iso);;All files (*.*)"));
if (fileName.isEmpty())
{
return;
} else {
QString file_name = fileName.at(0);
std::string file_0 = file_name.toUtf8().constData();
std::cout << "" << file_0 << std::endl;
}
} catch (...) {
g_message = "One of files cannot be opened.";
Taskcomplete taskcomplete;
taskcomplete.setModal(true);
taskcomplete.exec();
return;
};
}
Ответы (1 шт):
Просто вы учудили немного...
QStringList fileName;
try {
QStringList fileName = ...
Что мы видим? Вне блока try объявлена неинициализированная переменная fileName. Затем в блоке try объявлена другая переменная fileName, инициализирована. По выходе из блока она прекращает свою жизнедеятельность, и вы продолжаете работать с первой, неинициализированной переменной.
Все понятно? И понятно, что делать?..