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
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