Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: n2o от Апрель 03, 2011, 20:50



Название: Вылет на exec() в QFileDialog
Отправлено: 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 то стопорит на ней даже не открывая окна.


Название: Re: Вылет на exec() в QFileDialog
Отправлено: blood_shadow от Апрель 04, 2011, 11:02

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

как по мне так эти 2 диалоговых окна могут вылетать только из-за порченого указателя this,
больше просто нет из-за чего, проверьте этот указатель, попробуйте с помощью его что-то
сделать при закрытых эдитах


Название: Re: Вылет на exec() в QFileDialog
Отправлено: Fess от Апрель 04, 2011, 11:49
Вероятно, проблема не с QFileDialog :)
Просто вы неаккуратно работаете с памятью, а в момент вызова диалога это проявляется.
Из приведенного примера совершенно не ясно что это может вызывать.
К примеру,
QTextEdit *tmpDoc = new QTextEdit;
у вас где-то освобождаются эти указатели? Вы не используете их после удаления?


Название: Re: Вылет на exec() в QFileDialog
Отправлено: n2o от Апрель 04, 2011, 15:00
в программе я создаю QTextEdit *tmpDoc = new QTextEdit;
но при закрытии документа я освобождаю память и удаляю его.
и делаю так со всем что создавал. проверял несколько раз, вряд ли что-то мог упустить.

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

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

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



Название: Re: Вылет на exec() в QFileDialog
Отправлено: Пантер от Апрель 04, 2011, 15:04
Что-то у тебя совсем все плохо. Давай код сюда.


Название: Re: Вылет на exec() в QFileDialog
Отправлено: n2o от Апрель 04, 2011, 15:17
Да ладно, кода много, и он запутанный, замучаешься только разбираться, время потратишь много.
Это мне весь код проги надо кидать чтоб вы смогли отследить всё необходимое. Много глобальных массивов и переменных. 800 строк.
Ладно, так работает да и ладно, только несколько десятков строк лишних.


Название: Re: Вылет на exec() в QFileDialog
Отправлено: Пантер от Апрель 04, 2011, 15:21
Пересмотри архитектуру, она неправильная.


Название: Re: Вылет на exec() в QFileDialog
Отправлено: Fess от Апрель 04, 2011, 18:18
как вариант - деление на 0 - если количество элементов в массиве используется для вычисления чего-либо..
вообще, посади уже проблемный код в try catch и отлови исключения.