Russian Qt Forum

Qt => Вопросы новичков => Тема начата: alphawell от Август 11, 2015, 11:06



Название: SIGSEGV при попытке отобразить диалоговое окно
Отправлено: alphawell от Август 11, 2015, 11:06
Доброе время суток, уважаемые специалисты.

В книге Ж.Бланшетт и М.Саммерфилда "C++ GUI Programming with Qt 4, Second Edition" (часть 1 "Basic Qt", глава 3 "Creating Main Windows" подраздел "Using Dialogs") в  приведен следующий код для отображения диалогового окна (ранее созданного на основе QDialog) при выполнении соответствующей команды меню главного окна приложения:
Код
void MainWindow::find()
{
   if (!findDialog) {
       findDialog = new FindDialog(this);
       connect(findDialog, SIGNAL(findNext(const QString &,
...
   }
 
   findDialog->show();
   findDialog->raise();
   findDialog->activateWindow();
}
 

Хотелось бы для начала понять что за конструкция приведена в качестве условной для оператора if. Логично предположить, что это некая проверка того, был ли ранее выполнен конструктор данного объекта, но в документации по классу QDialog я таких членов-функций в его составе не нашел. Информации, приведенной в книге также недостаточно:
Цитировать
If the Find dialog doesn't already exist, we create it and connect its findNext() and findPrevious() signals to the corresponding Spreadsheet slots.

Основная же проблема заключается в том, что реализовав подобную конструкцию в своем коде, я, при попытке запустить программу, получаю ошибку, под отладчиком выдает SIGSEGV Segmentation fault. Отладчик показывает на строку, следующую после тела конструкции ветвления (setModal(true)):

Код
void MainWindow::configureLayers()
{
   if (!layersDialog) {
   layersDialog = new layersConfigDialog(this);
   }
 
   layersDialog->setModal(true);
   layersDialog->show();
   layersDialog->activateWindow();
}
 

Класс layersConfigDialog создан на базе QDialog в полном соответствии с примерами из книги. configureLayers (как и find в первом случае) это private-слот класса MainWindow.
Хотелось бы понять в чем ошибка. Заранее благодарю за помощь.


Название: Re: SIGSEGV при попытке отобразить диалоговое окно
Отправлено: Пантер от Август 11, 2015, 11:15
Видимо, ты в конструкторе не инициализируешь findDialog нулем.


Название: Re: SIGSEGV при попытке отобразить диалоговое окно
Отправлено: alphawell от Август 11, 2015, 11:51
Видимо, ты в конструкторе не инициализируешь findDialog нулем.

Благодарю Вас, помогло.