Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: antipart от Ноябрь 04, 2006, 22:54



Название: Немодальный QDialog
Отправлено: 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();
}


Название: Немодальный QDialog
Отправлено: Dendy от Ноябрь 04, 2006, 23:05
Потому что нельзя использовать неинициализированньІе данньІе! Компиллятор должен бьІл вьІдать предупреждение о попьІтке сравнения указателя на QDialog с нулём.

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

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

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

Мораль: Инициализируйте переменньІе!


Название: Немодальный QDialog
Отправлено: antipart от Ноябрь 04, 2006, 23:09
простите, но я не понял - если "d" непроинициализирована , то почему не выполняется условие  if (! d)


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

if (!d)
{
}

Всегда будет возвращать false, если только d не имеет значение 0.


Название: Немодальный QDialog
Отправлено: antipart от Ноябрь 05, 2006, 00:01
Странно , почему же тогда работает в других случаях, не связанных с QDialog?
Но больше всего тогда удивляет то , что в примерах используется именно такой метод создания немодальных окон...
Иначе их наплодится столько.....


Название: Немодальный QDialog
Отправлено: Lion от Ноябрь 05, 2006, 00:33
В общем надо делать так:
Код:
QDialog *d = 0; 

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


Название: Немодальный QDialog
Отправлено: antipart от Ноябрь 05, 2006, 00:41
Да , так работает , но тогда смысл в условии отпадает...
Так как каждый раз создается новый объект...
Конечно, можно "d" объявить глобально, но не хотелось бы...


Название: Немодальный QDialog
Отправлено: Dendy от Ноябрь 05, 2006, 00:47
Цитата: "antipart"
Странно , почему же тогда работает в других случаях, не связанных с QDialog?


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

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


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

Покажите пример :)

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

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


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

Уверен, блин, что она инициализируется нулём аль через new оператор аль ещё ким-нить присвоением. Ну только не никак не инициализируется.


Название: Немодальный QDialog
Отправлено: Steven_Orko от Ноябрь 05, 2006, 00:48
АБСОЛЮТНО поддерживаю Dendy: Не верю!!!
Работать будет только такой код:
Код:

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

  if (NULL != d) //"Хороший" стиль программирования
  {
     d = new QDialog(this); // сюда попадаем при следующем вызове ункции
          .....
   }
  d->show();
}


Название: Немодальный QDialog
Отправлено: antipart от Ноябрь 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 вроде как не глобальный


Название: Немодальный QDialog
Отправлено: Steven_Orko от Ноябрь 05, 2006, 00:59
Насколько я помню, в этом примере findDialog является переменной-членом класса MainWindow и инициализируется в конструкторе.


Название: Немодальный QDialog
Отправлено: antipart от Ноябрь 05, 2006, 01:09
Большое спасибо...заработало корректно
все дело в волшебных пузырьках..(static)
такая конструкция
Код:
static QDialog *dialog=NULL;

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

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

 Еще один вопрос...
как этот диалог заставить разворачиваться на весь экран...
если не затруднит...  :lol:


Название: Немодальный QDialog
Отправлено: Steven_Orko от Ноябрь 05, 2006, 01:14
showFullScreen()


Название: Немодальный QDialog
Отправлено: antipart от Ноябрь 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()

Нет я имел в виду добаление кнопарей (свернуть - развернуть) в заголовке ...
или разворачивать на полный экран и обратно,  при двойном щелчке по заголовку...


Название: Немодальный QDialog
Отправлено: Dendy от Ноябрь 05, 2006, 02:33
Дивитися:

$(QTDIR)/examples/wingets/windowflags


Название: Немодальный QDialog
Отправлено: antipart от Ноябрь 05, 2006, 09:32
Спасибо за маячок...