Russian Qt Forum
Сентябрь 28, 2024, 02:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вылет на exec() в QFileDialog  (Прочитано 5108 раз)
n2o
Гость
« : Апрель 03, 2011, 20:50 »

Пишу текстовый редактор с возможностью работы с несколькими документами.
Когда открыто хоть одно текстовое поле QTextEdit и я вызываю окно QFileDialog, то всё нормально открывается.
Но когда я закрываю все текстовые поля, то есть на экране нет поля ввода и я вызываю QFileDialog, то программа вылетает, и даже диалоговое окно не появляется, и вылетает она на слоте exec(), который выводит окно на экран.
Пробовал заменить статической функцией QFileDialog::getOpenFileName, но такая же ерунда, вылетает на этой функции.
Но если хоть одно текстовое поле открыто, то всё в норме.
Код:
QFileDialog dialog(this);
dialog.setNameFilter( tr("Text Files (*.txt);;HTML (*.html *.htm);; All (*)"));
dialog.setAcceptMode(QFileDialog::AcceptOpen);

QStringList fn1;
if (dialog.exec())
 {
 fn1=dialog.selectedFiles();
 QString fn=fn1.back();  
if(fn!="")
{
QFile f(fn);

if (!f.open(QIODevice::ReadOnly))
{
       QMessageBox::critical(this, tr("Error"),
                       tr("Could not open file"));
       return;
   }

f.open(QIODevice::ReadOnly);
QTextStream ts1(&f);
ts1.setCodec("UTF-8");
QString text=ts1.readAll();

f.close();

QString newFilename=fn.section( "/", -1, -1 );
filename.push_back(fn);

N++;

//Создание нового поля ввода

QString editname= "textEdit" + QString::number(N);
QTextEdit *tmpDoc = new QTextEdit;
tmpDoc->setObjectName(editname);
tmpDoc->setGeometry(0,190,scrWidth,Htext);
tmpDoc->setText(text);

doc.push_back(tmpDoc);
flagSave.push_back(false);
ui.FileComboBox->addItem(newFilename);
int col2=ui.FileComboBox->count()-1;
ui.FileComboBox->setCurrentIndex(col2);


flagS=false;
}
}

То что находится в  if (dialog.exec()) {...} верно 100%, стопорит именно на этом слоте.
Либо если меняю всё это на функцию QFileDialog::getOpenFileName то стопорит на ней даже не открывая окна.
« Последнее редактирование: Апрель 04, 2011, 10:53 от n2o » Записан
blood_shadow
Гость
« Ответ #1 : Апрель 04, 2011, 11:02 »


То что находится в  if (dialog.exec()) {...} верно 100%, стопорит именно на этом слоте.
Либо если меняю всё это на функцию QFileDialog::getOpenFileName то стопорит на ней даже не открывая окна.

как по мне так эти 2 диалоговых окна могут вылетать только из-за порченого указателя this,
больше просто нет из-за чего, проверьте этот указатель, попробуйте с помощью его что-то
сделать при закрытых эдитах
Записан
Fess
Гость
« Ответ #2 : Апрель 04, 2011, 11:49 »

Вероятно, проблема не с QFileDialog Улыбающийся
Просто вы неаккуратно работаете с памятью, а в момент вызова диалога это проявляется.
Из приведенного примера совершенно не ясно что это может вызывать.
К примеру,
QTextEdit *tmpDoc = new QTextEdit;
у вас где-то освобождаются эти указатели? Вы не используете их после удаления?
Записан
n2o
Гость
« Ответ #3 : Апрель 04, 2011, 15:00 »

в программе я создаю QTextEdit *tmpDoc = new QTextEdit;
но при закрытии документа я освобождаю память и удаляю его.
и делаю так со всем что создавал. проверял несколько раз, вряд ли что-то мог упустить.

Теперь я выяснил следующее:
у меня есть массив объектов QTextEdit и когда я его очищаю полностью тогда и глюк с exec(). Пробовал перед очищением освобождать память, но без изменений. Но если хоть один объект оставляю в этом массиве, то всё работает нормально.

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

Это называется через одно место, но другого выхода не нашёл.

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Апрель 04, 2011, 15:04 »

Что-то у тебя совсем все плохо. Давай код сюда.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
n2o
Гость
« Ответ #5 : Апрель 04, 2011, 15:17 »

Да ладно, кода много, и он запутанный, замучаешься только разбираться, время потратишь много.
Это мне весь код проги надо кидать чтоб вы смогли отследить всё необходимое. Много глобальных массивов и переменных. 800 строк.
Ладно, так работает да и ладно, только несколько десятков строк лишних.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Апрель 04, 2011, 15:21 »

Пересмотри архитектуру, она неправильная.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Fess
Гость
« Ответ #7 : Апрель 04, 2011, 18:18 »

как вариант - деление на 0 - если количество элементов в массиве используется для вычисления чего-либо..
вообще, посади уже проблемный код в try catch и отлови исключения.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.119 секунд. Запросов: 22.