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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Немодальный QDialog  (Прочитано 11459 раз)
antipart
Гость
« : Ноябрь 04, 2006, 22:54 »

Подскажите пожалуйста , почему не срабатывает условие...

 
Код:

QDialog *d;

  if (! d)
  {
 d = new QDialog(this); // сюда не попадает
          .....
   }
  d->show();


 похожее на то что в примере ...

Код:
void MainWindow::find()
{
    if (!findDialog) {
        findDialog = new FindDialog(this);
        ...
    }
    findDialog->show();
    findDialog->activateWindow();
}
Записан
Dendy
Гость
« Ответ #1 : Ноябрь 04, 2006, 23:05 »

Потому что нельзя использовать неинициализированньІе данньІе! Компиллятор должен бьІл вьІдать предупреждение о попьІтке сравнения указателя на QDialog с нулём.

Вспоминается анекдот:

Цитировать
Дала как-то Мальвина Буратине пять яблок. Три он сьел. Вопрос: Сколько яблок осталось у Буратино?

Ответ: Хрен его знает...

Мораль: Инициализируйте переменньІе!
Записан
antipart
Гость
« Ответ #2 : Ноябрь 04, 2006, 23:09 »

простите, но я не понял - если "d" непроинициализирована , то почему не выполняется условие  if (! d)
Записан
Steven_Orko
Гость
« Ответ #3 : Ноябрь 04, 2006, 23:55 »

А потому, что в момент создания переменной не было сказано, каким значением она должна быть проинициализирована. Следовательно, компилятор туда засунет все, что угодно. Очень маленькая вероятность, что там окажется эвивалент значения NULL. Так как переменная - это, грубо говоря, именнованная область памяти, то происходит простая ассоциация имени переменной с этой областью памяти. Память может быть где угодно, на стеке, в куче... До этого там могло находится (и в большинстве случаев находилось точно)  какое-либо значение, которое использовалось самой программой или системой в собственных целях. А проверка
Код:

if (!d)
{
}

Всегда будет возвращать false, если только d не имеет значение 0.
Записан
antipart
Гость
« Ответ #4 : Ноябрь 05, 2006, 00:01 »

Странно , почему же тогда работает в других случаях, не связанных с QDialog?
Но больше всего тогда удивляет то , что в примерах используется именно такой метод создания немодальных окон...
Иначе их наплодится столько.....
Записан
Lion
Гость
« Ответ #5 : Ноябрь 05, 2006, 00:33 »

В общем надо делать так:
Код:
QDialog *d = 0; 

  if (! d)
  {
     d = new QDialog(this); // сюда не попадает
          .....
   }
  d->show();
Записан
antipart
Гость
« Ответ #6 : Ноябрь 05, 2006, 00:41 »

Да , так работает , но тогда смысл в условии отпадает...
Так как каждый раз создается новый объект...
Конечно, можно "d" объявить глобально, но не хотелось бы...
Записан
Dendy
Гость
« Ответ #7 : Ноябрь 05, 2006, 00:47 »

Цитата: "antipart"
Странно , почему же тогда работает в других случаях, не связанных с QDialog?


Разве что по счастливой случайности. Ой! Что ето я... По несчастной случайности! Ибо на другой машине/компилляторе/программе етот модуль вьІлетит с криком "Ай-яй-яй".

Цитата: "antipart"
Но больше всего тогда удивляет то , что в примерах используется именно такой метод создания немодальных окон...
Иначе их наплодится столько.....


"Не верю!" (с)

Покажите пример Улыбающийся

добавлено спустя 4 минуты:

 
Цитата: "antipart"
Конечно, можно "d" объявить глобально, но не хотелось бы...


Да скорее всего в примерах, откуда вьІ смотрели, переменная ента инициализируется при создании глобальной переменной (чё за товтология...). Вобщем, смотрите в реализацию, где создаётся оная d.

Уверен, блин, что она инициализируется нулём аль через new оператор аль ещё ким-нить присвоением. Ну только не никак не инициализируется.
Записан
Steven_Orko
Гость
« Ответ #8 : Ноябрь 05, 2006, 00:48 »

АБСОЛЮТНО поддерживаю Dendy: Не верю!!!
Работать будет только такой код:
Код:

void myfuction(...)
{
static QDialog *d = NULL; //Ну или 0

  if (NULL != d) //"Хороший" стиль программирования
  {
     d = new QDialog(this); // сюда попадаем при следующем вызове ункции
          .....
   }
  d->show();
}
Записан
antipart
Гость
« Ответ #9 : Ноябрь 05, 2006, 00:52 »

Цитата: "Dendy"
Цитата: "antipart"
Странно , почему же тогда работает в других случаях, не связанных с QDialog?


Разве что по счастливой случайности. Ой! Что ето я... По несчастной случайности! Ибо на другой машине/компилляторе/программе етот модуль вьІлетит с криком "Ай-яй-яй".

Цитата: "antipart"
Но больше всего тогда удивляет то , что в примерах используется именно такой метод создания немодальных окон...
Иначе их наплодится столько.....


"Не верю!" (с)

Покажите пример Улыбающийся
Да, прошу прощения , в других случаях у меня указатель объявляется как глобальный , поэтому работает...
А насчет примеров , сам не могу понять...
Пример взят из книги всеми знакомой "Ж. Бланшетт, М. Саммерфильд, "Разработка графического интерфейса с помощью библиотеки Qt""...
void MainWindow::find()
{
  if (!findDialog) {
    findDialog = new FindDialog(this);
    connect(findDialog, SIGNAL(findNext(const QString &, bool)),
            spreadsheet, SLOT(findNext(const QString &, bool)));
    connect(findDialog, SIGNAL(findPrev(const QString &, bool)),
            spreadsheet, SLOT(findPrev(const QString &, bool)));
  }
 
  findDialog->show();
  findDialog->raise();
  findDialog->setActiveWindow();
}
 и там этот findDialog вроде как не глобальный
Записан
Steven_Orko
Гость
« Ответ #10 : Ноябрь 05, 2006, 00:59 »

Насколько я помню, в этом примере findDialog является переменной-членом класса MainWindow и инициализируется в конструкторе.
Записан
antipart
Гость
« Ответ #11 : Ноябрь 05, 2006, 01:09 »

Большое спасибо...заработало корректно
все дело в волшебных пузырьках..(static)
такая конструкция
Код:
static QDialog *dialog=NULL;

 работает верно ...
сам бы пожалуй не допер...[/b]

добавлено спустя 7 минут:

 Еще один вопрос...
как этот диалог заставить разворачиваться на весь экран...
если не затруднит...  :lol:
Записан
Steven_Orko
Гость
« Ответ #12 : Ноябрь 05, 2006, 01:14 »

showFullScreen()
Записан
antipart
Гость
« Ответ #13 : Ноябрь 05, 2006, 01:26 »

Цитировать
Насколько я помню, в этом примере findDialog является переменной-членом класса MainWindow и инициализируется в конструкторе.

то что findDialog является переменной-членом класса MainWindow и я помню, а вот то что она инициализируется в конструкторе не заметил...
Код:

MainWindow::MainWindow(QWidget *parent, const char *name)
    : QMainWindow(parent, name)
  {
    spreadsheet = new Spreadsheet(this);
    setCentralWidget(spreadsheet);
    createActions();
    createMenus();
    createToolBars();
    createStatusBar();
    readSettings();
    setCaption(tr("Spreadsheet"));
    setIcon(QPixmap::fromMimeSource("icon.png"));
    findDialog = 0;  //<<<<<<<<<<<<<<<<<<<-----------------  :shock:
    fileFilters = tr("Spreadsheet files (*.sp)");
    modified = false;
  }      


Видимо поздно уже...
Но все равно это бы меня не спасло...
Как локально это оформить не додумался бы....
Поэтому еще раз Б. Спасибо... :wink:

добавлено спустя 4 минуты:

 
Цитировать
showFullScreen()

Нет я имел в виду добаление кнопарей (свернуть - развернуть) в заголовке ...
или разворачивать на полный экран и обратно,  при двойном щелчке по заголовку...
Записан
Dendy
Гость
« Ответ #14 : Ноябрь 05, 2006, 02:33 »

Дивитися:

$(QTDIR)/examples/wingets/windowflags
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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