Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/02/2008, à 18:24

Darunia

GTKMM : Ouvrir une fenetre à  partir d'un autre fenetre

Salut à  tous,

Je debute GTKMM et je cale sur un truc vraiment débile : j'ai une barre d'outils dans ma fenetre principale, et je souhaite ouvrir une autre fenetre quand je clique sur un des boutons de la barre.

J'ai donc créé une nouvelle classe qui hérite de Gtk::Window.

Code de la fenetre (en partie) :

CAddressInput::CAddressInput() :
    Window(),
    VBox(0, false),
    InputHBox(0, false),
    ButtonsHBox(0, false),
    Text("Enter address to jump to :"),
    AddrEntry(),
    CmdOK("OK"),
    CmdCancel("Cancel")

{
    set_title("Jump to address");
    set_default_size(200, 60);

    InputHBox.pack_start(Text);
    InputHBox.add(AddrEntry);

    VBox.pack_start(InputHBox);

    ButtonsHBox.pack_start(CmdCancel);
    ButtonsHBox.add(CmdOK);

    VBox.add(ButtonsHBox);

    add(VBox);

    show_all_children();
}

Code censé afficher la fenetre :

    CAddressInput AddrInput;

    AddrInput.set_modal(true);
    AddrInput.show();

Le code d'appel est bien executé (verifié avec le debugger), le truc c'est que rien ne se passe, et je n'ai meme pas le moindre warning dans la console ?!?

Hors ligne

#2 Le 02/03/2015, à 17:42

dguichaoua49

Re : GTKMM : Ouvrir une fenetre à  partir d'un autre fenetre

Comme depuis le temps personne n'a donné de solution, et comme j'ai eu beaucoup de mal à la trouver voici une solution :

Fichier main.cpp

#include "win_mere.hpp"
#include <gtkmm/application.h>

int main(int argc, char *argv[])
{
  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

  //Créer la fenêtre mère
  win_mere my_win_mere;

  //On l'affiche, l'exécute
  return app->run(my_win_mere);
}

On créer une classe "win_mere" pour la fenêtre mère.
Le fichier win_mere.hpp :

#ifndef GTKMM_EXAMPLE_WINDOW_MERE_H
#define GTKMM_EXAMPLE_WINDOW_MERE_H

#include <gtkmm/window.h>
#include <gtkmm/button.h>
#include "win_fille.hpp"

class win_mere : public Gtk::Window
{
public:
  win_mere();
  virtual ~win_mere();

protected:
  //Signal handlers:
  void on_button_clicked();

  //Le boutton:
  Gtk::Button m_button;

  //On créer la fenêtre fille ici !!!
  win_fille my_win_fille;
};

#endif //GTKMM_EXAMPLE_WINDOW_MERE_H

Le fichier win_mere.cpp :

#include "win_mere.hpp"

win_mere::win_mere()
{
  //Fenêtre avec un seul bouton "Ouvrir Fille" pour afficher la fenêtre fille
  m_button.add_pixlabel("info.xpm", "Ouvrir Fille");

  set_title("win_mere!");
  set_border_width(10);

  m_button.signal_clicked().connect( sigc::mem_fun(*this,
              &win_mere::on_button_clicked) );

  add(m_button);

  show_all(); 
}

win_mere::~win_mere()
{
}

void win_mere::on_button_clicked()
{
   //quand on appuis sur le bouton on ouvre la fenêtre fille
    my_win_fille.set_modal(true);  //pour que la fenêtre fille soit modale
    my_win_fille.show();  //affiche la fenêtre fille
}

On créer une classe "win_fille" pour la fenêtre fille.
Le fichier win_fille.hpp :

#ifndef GTKMM_EXAMPLE_WINDOW_FILLE_H
#define GTKMM_EXAMPLE_WINDOW_FILLE_H

#include <gtkmm/window.h>
#include <gtkmm/button.h>

class win_fille : public Gtk::Window
{
public:
  win_fille();
  virtual ~win_fille();

protected:
  //Signal handlers:
  void on_button_clicked();

  //Child widgets:
  Gtk::Button m_button;
};

#endif //GTKMM_EXAMPLE_WINDOW_FILLE_H

Le fichier win_fille.cpp :

#include "win_fille.hpp"

win_fille::win_fille()
{
 //Fenêtre avec un seul bouton "Fermer"
  m_button.add_pixlabel("info.xpm", "Fermer");

  set_title("win_fille!");
  set_border_width(10);

  m_button.signal_clicked().connect( sigc::mem_fun(*this,
              &win_fille::on_button_clicked) );

  add(m_button);

  show_all_children();  //et non show_all sinon la fenêtre fille vas s'afficher tout de suite
}

win_fille::~win_fille()
{
}

void win_fille::on_button_clicked()
{
   //quand on clique sur le bouton on ferme la fenêtre fille pour redonner le focus à la fenêtre mère
    hide();
}

Dernière modification par dguichaoua49 (Le 02/03/2015, à 17:47)

Hors ligne