Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: QFileDialog ou autre dans la boucle event SFML  (Lu 2799 fois)

0 Membres et 1 Invité sur ce sujet

lirvine

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
QFileDialog ou autre dans la boucle event SFML
« le: Mai 30, 2014, 03:12:47 pm »
Bonjour à tous,
J'ai développé un projet en c# il y a quelque temps que j'adapte en c++, pour des problèmes de performance.
J'ai décidé d'utilisé SFML qui est très intuitive je trouve, et d'utilisé QT pour le Gui.
j’avançais pas mal jusqu'au moment ou j'ai voulut faire une première utilisation de QT pour imprimé et récupérer le chemin de fichier. (Je ne maitrise pas trop QT)
mon problème est que une fenêtre QFileDialog::getOpenFileName par exemple fige aléatoirement.

        // la boucle principale
        bool running = true;

        while (running)
                {
        // évènements
                sf::Event event;
                while (window.pollEvent(event))
            {
                        //touche echape ou fermeture fenetre
                        if ((event.type == sf::Event::Closed) || ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)))
                                {
                // on stoppe le programme
                running = false;
                                }


                        //si click gauche
                        if ((event.type == sf::Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
                                {
                //je verifie si la souris est sur le sprite
                if((sprite.getPosition().x  <  event.mouseButton.x) && (event.mouseButton.x  < (sprite.getPosition().x + sprite.getGlobalBounds().width))&&
                   (sprite.getPosition().y  <  event.mouseButton.y) && (event.mouseButton.y  < (sprite.getPosition().y + sprite.getGlobalBounds().height)))
                    {
                    QString fileName = QFileDialog::getOpenFileName(0,"Open File",QString(),"BMP File(*.BMP)");

                    std::cout << "chouette" << std::endl;
                    }


                                }

                        }


        window.clear(sf::Color::Black);

        window.draw(sprite);

                window.display();
                }

        }

Je pense que c'est un problème de event mais je suis même pas sur.
merci
« Modifié: Mai 30, 2014, 03:16:41 pm par lirvine »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : QFileDialog ou autre dans la boucle event SFML
« Réponse #1 le: Mai 30, 2014, 08:01:04 pm »
Tu ne peux pas utiliser Qt de cette manière. Il faut créer une application Qt, avec fenêtre Qt et boucle d'évènements Qt, et intégrer SFML dans tout ça. Là tu fais l'inverse, ça ne marchera pas.
Laurent Gomila - SFML developer

lirvine

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : QFileDialog ou autre dans la boucle event SFML
« Réponse #2 le: Mai 31, 2014, 02:21:27 pm »
Bonjour,

je n'est pas mis tous le code, j'ai déjà une application QT et une fenêtre QT, sinon ça compilerais pas et la fenêtre QFileDialog::getOpenFileName ne fonctionnerais pas de temps en temps je pense.
Je pense que je ne comprend pas la boucle event de QT.

Je pense que la fenetre QFileDialog::getOpenFileName s'ouvre et attend un event QT qu'il ne vois jamais a cause de la boucle while de SFML mais je ne comprend pas pourquoi certaine fois ça fonctionne.

Une chose intéressante est que les events SFML fonctionne quand la fenêtre QFileDialog::getOpenFileName est figé, je peut appuyé sur le bouton "echap" ce qui permet de revenir à l'affichage normal en fonctionnement normal mais sans sortir de l'application.

Je met le code entier.


mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>

#include <SFML/Graphics.hpp>
#include <iostream>


namespace Ui
        {
        class MainWindow;
        }

class MainWindow : public QMainWindow
        {
        Q_OBJECT

        public:
                explicit MainWindow(QWidget *parent = 0);
                ~MainWindow();

        private:
                Ui::MainWindow *ui;
        };

#endif // MAINWINDOW_H


mainwindow.h
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
        {
        // Creation d'une fenêtre plein écran avec le  mode vidéo du bureau
        sf::VideoMode DesktopMode = sf::VideoMode::getDesktopMode();

        //je creer la fenetre de l'application
    sf::RenderWindow window(DesktopMode, "fenetre test", sf::Style::None, sf::ContextSettings(32));
    window.setVerticalSyncEnabled(true);

    sf::Texture texture;
    sf::Sprite sprite;

    if (!texture.loadFromFile("c:\\test.png"))
        {
        std::cout << "Error loading file !" << std::endl;
        }

    sprite.setTexture(texture);


    std::cout << "Start" << std::endl;


        // la boucle principale
        bool running = true;

        while (running)
                {
        // évènements
                sf::Event event;
                while (window.pollEvent(event))
            {
                        //touche echape ou fermeture fenetre
                        if ((event.type == sf::Event::Closed) || ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)))
                                {
                // on stoppe le programme
                running = false;
                                }


            //si click gauche
            if ((event.type == sf::Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
                                {
                //je verifie si la souris est sur le sprite
                if((sprite.getPosition().x  <  event.mouseButton.x) && (event.mouseButton.x  < (sprite.getPosition().x + sprite.getGlobalBounds().width))&&
                   (sprite.getPosition().y  <  event.mouseButton.y) && (event.mouseButton.y  < (sprite.getPosition().y + sprite.getGlobalBounds().height)))
                    {
                    QString fileName = QFileDialog::getOpenFileName(0,"Open File",QString(),"BMP File(*.BMP)");

                    std::cout << "chouette" << std::endl;
                    }

                                }
                        }


        window.clear(sf::Color::Black);

        window.draw(sprite);

                window.display();
                }

        }

MainWindow::~MainWindow()
        {
        //delete ui;
        }

main.cpp
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
        {
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
   
    return a.exec();
        }

merci
« Modifié: Mai 31, 2014, 02:24:59 pm par lirvine »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : QFileDialog ou autre dans la boucle event SFML
« Réponse #3 le: Mai 31, 2014, 02:47:18 pm »
Tu ne peux pas avoir une boucle d'évènements SFML, puisque celle-ci va bloquer et du coup tu vas tout le temps rester dans le constructeur de MainWindow. Du coup la boucle d'évènements de Qt ne va  jamais s'exécuter.

Regarde les tutoriels SFML 1.6, il y a un exempel d'intégration à Qt. Ca te donnera l'idée générale.
Laurent Gomila - SFML developer

lirvine

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : QFileDialog ou autre dans la boucle event SFML
« Réponse #4 le: Mai 31, 2014, 03:15:14 pm »
Vous voulez parler de QSFML je pense.
Je l'ai essayé mais j'ai un doute, quand on choisit de l'utiliser on utilise plus du tout les événements SFML c'est bien ça ?
Si par exemple j'ai 20 Sprites sur lesquels je veut les événements souris sur chacun, le principe est de construire 20 widgets qui encapsuleront chacun le code SFML d'un Sprite et je me servirais de chaque Widgets indépendamment pour gérer les événements.
Mais je suis pas sur.
« Modifié: Mai 31, 2014, 03:22:15 pm par lirvine »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : QFileDialog ou autre dans la boucle event SFML
« Réponse #5 le: Mai 31, 2014, 05:27:30 pm »
Citer
Je l'ai essayé mais j'ai un doute, quand on choisit de l'utiliser on utilise plus du tout les événements SFML c'est bien ça ?
Ils ne fonctionnent pas de manière fiable dans ce contexte, donc mieux vaut éviter en effet.

Citer
Si par exemple j'ai 20 Sprites sur lesquels je veut les événements souris sur chacun, le principe est de construire 20 widgets qui encapsuleront chacun le code SFML d'un Sprite et je me servirais de chaque Widgets indépendamment pour gérer les événements.
Non pas du tout. Tu continues à tout gérer comme avant, sauf qu'au lieu de chopper les évènements de sf::Window tu les choppes de QWidget. C'est tout.
Laurent Gomila - SFML developer

lirvine

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : QFileDialog ou autre dans la boucle event SFML
« Réponse #6 le: Juin 02, 2014, 10:19:23 am »
Ok, je pense avoir compris
Je vais faire quelques essais.

Merci beaucoup