На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> Закрытие оновного окна , Gtk+/Glade/Dev-C++/WinXp
    Итак.
    после открытия основного окна
    ExpandedWrap disabled
        windowMain_create ();
        gtk_widget_show (windowMain);
        g_signal_connect ((gpointer) windowMain, "destroy", G_CALLBACK(gtk_main_quit),
                          NULL);

    вызывается диалог логина с кнопками "Вход" и "Выход"
    ExpandedWrap disabled
      void
      on_windowMain_show                     (GtkWidget       *widget,
                                              gpointer         user_data)
      {
        on_toExit_activate(NULL, NULL);
      }

    по нажатию "Вход" осуществляется проверка логин/пароля и вход в порграмму
    иначе закрвается не только диалог, но и основное окно
    ExpandedWrap disabled
      void
      on_toExit_activate                     (GtkMenuItem     *menuitem,
                                              gpointer         user_data)
      {
        dialogLogin_create();
        gint result = dialogLogin_run();
        dialogLogin_destroy();
        if (result!=GTK_RESPONSE_OK)
          windowMain_destroy();
      }

    Однако хотя окно и закрывается порцесс остается в памяти...
    ExpandedWrap disabled
      void windowMain_destroy (void)
      {
      //  gtk_signal_emit_by_name (GTK_OBJECT(windowMain),"destroy");
        gtk_widget_destroy(windowMain);  
        windowMain=NULL;
      }

    здесь закоментирована попытка послать окну сообщение - не прокатила
    ПОЧЕМУ? как с этим бороться?
    ------------------------------
    исходники прилагаются
    Прикреплённый файлПрикреплённый файлnoDOSgtk.zip (126.55 Кбайт, скачиваний: 93)
      Кажется для полного завершения процесса нужно еще вызвать gtk_main_quit
        Цитата mrco @
        Кажется для полного завершения процесса нужно еще вызвать gtk_main_quit

        Цитата nawok78 @
        g_signal_connect ((gpointer) windowMain, "destroy", G_CALLBACK(gtk_main_quit),
        NULL);

        при нажатии "Х" на главном окне - закрывается как надо

        Добавлено
        ExpandedWrap disabled
          void windowMain_destroy (void)
          {
          //  gtk_signal_emit_by_name (GTK_OBJECT(windowMain),"destroy");
            gtk_main_quit();
            gtk_widget_destroy(windowMain);  
            gtk_main_quit();
            windowMain=NULL;
            gtk_main_quit();
          }

        :tong: :no: даже 3 gtk_main_quit не помогли!!!
        Сообщение отредактировано: nawok78 -
          скиньте плиз исходники этой самой gtk_main_quit и gtk_window у кого есть лучше прям сюда
            путем эксперимента выявлено, что
            ExpandedWrap disabled
              g_signal_connect ((gpointer) windowMain, "destroy", G_CALLBACK(gtk_main_quit),NULL);

            необходимое условие "чистого" выхода из программы
            достаточным является нажатие "X" на окне
            КАК ИМИТИРОВАТЬ ЕГО НАЖАТИЕ????

            Добавлено
            проблемма действительно в том что ,
            что войдя в цикл он не может выйти gtk_main_quit() не срабатывает
            ExpandedWrap disabled
              void
              gtk_main_quit (void)
              {
                g_return_if_fail (main_loops != NULL);
               
                g_main_loop_quit (main_loops->data);
              }

            скорее всего не выполняется условие main_loops != NULL
              Хоть бы кто помог!!!
              ExpandedWrap disabled
                int
                main (int argc, char *argv[])
                {
                //...
                  windowMain_create ();
                //...
                }

              ExpandedWrap disabled
                void windowMain_create (void)
                {
                  _windowMain.window = create_windowMain ();
                  gtk_widget_show (_windowMain.window);
                  g_signal_connect ((gpointer) _windowMain.window, "destroy", G_CALLBACK(gtk_main_quit),
                                    NULL);
                }
                 
                void windowMain_destroy (void)
                {
                //  gtk_main_quit();
                  gtk_object_destroy(GTK_OBJECT(_windowMain.window));  
                  _windowMain.window=NULL;
                }

              ExpandedWrap disabled
                void
                on_windowMain_show                     (GtkWidget       *widget,
                                                        gpointer         user_data)
                {
                  on_toExit_activate(NULL, NULL);
                }
                 
                void
                on_toExit_activate                     (GtkMenuItem     *menuitem,
                                                        gpointer         user_data)
                {
                  dialogLogin_create();
                  gint result = dialogLogin_run();
                  dialogLogin_destroy();
                  if (result!=GTK_RESPONSE_OK)
                  {
                    windowMain_destroy();
                  }
                  else
                    gtk_main ();
                }

              теперь ситуация противоположная - программа "висит" если после входа нажать "Х"

              Добавлено
              Ура!!! Вот так решается этот геморрой!!!
              ExpandedWrap disabled
                int
                main (int argc, char *argv[])
                {
                //...
                  windowMain_create ();
                  dialogLogin_create();
                  gint result = dialogLogin_run();
                  dialogLogin_destroy();
                  if (result!=GTK_RESPONSE_OK)
                  {
                    windowMain_destroy();
                  }
                  else
                    gtk_main ();
                //...
                }

              ExpandedWrap disabled
                void windowMain_create (void)
                {
                  _windowMain.window = create_windowMain ();
                  gtk_widget_show (_windowMain.window);
                  g_signal_connect ((gpointer) _windowMain.window, "destroy", G_CALLBACK(gtk_main_quit),
                                    NULL);
                //  widget=lookup_widget(windowMain, "toExit")
                }
                 
                void windowMain_destroy (void)
                {
                  gtk_object_destroy(GTK_OBJECT(_windowMain.window));  
                  _windowMain.window=NULL;
                }

              ExpandedWrap disabled
                void
                on_windowMain_show                     (GtkWidget       *widget,
                                                        gpointer         user_data)
                {
                }
                void
                on_toExit_activate                     (GtkMenuItem     *menuitem,
                                                        gpointer         user_data)
                {
                  dialogLogin_create();
                  gint result = dialogLogin_run();
                  dialogLogin_destroy();
                  if (result!=GTK_RESPONSE_OK)
                  {
                    windowMain_destroy();
                  }
                }
              Сообщение отредактировано: nawok78 -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0628 ]   [ 16 queries used ]   [ Generated: 25.04.24, 04:21 GMT ]