Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt3] Création d'une simple fenêtre

Je débute sous Qt et j'ai un souci pour créer une simple fenêtre sous Qt.
Le but: afficher une fenêtre avec deux boutons.
Un bouton permet de quitter tandis que le 2e sert à charger une image (pour le moment on ne s'en préoccupe pas).

Je suivi les tutoriaux du site de Trolltech et j'ai décidé de faire ma class Fenetre sur la base de la class QMainWindow.

fenetre.h
#ifndef FENETRE_H
#define FENETRE_H

#include<qwidget.h>
#include<qmainwindow.h>
#include<qpushbutton.h>


class QPushButton;

class Fenetre : public QMainWindow
{
public:
Fenetre(QWidget *parent=0, const char *name=0);
~Fenetre();

QPushButton *OpenBut;
QPushButton *QuitBut;

public slots:
void ChargerImage();
};

#endif

Et je défini ladite classe Fenetre dans fenetre.cpp:
#include<qpoint.h>
#include<qfiledialog.h>
#include<qstring.h>

#include"fenetre.h"


Fenetre::Fenetre(QWidget *parent, const char *name)
: QMainWindow(parent, name)
{
OpenBut = new QPushButton(this, "OpenBut");
QuitBut = new QPushButton(this, "QuitBut");

resize(450, 420);
setCaption("Maestro");

OpenBut->setText("Open");
QuitBut->setText("Quit");

OpenBut->move(QPoint(10, 30));
QuitBut->move(QPoint(10, 80));

connect(OpenBut, SIGNAL(clicked()), this, SLOT(ChargerImage()));
connect(QuitBut, SIGNAL(clicked()), this, SLOT(quit()));
}

Fenetre::~Fenetre()
{

}

void Fenetre::ChargerImage()
{
QString FilePath;

FilePath = QFileDialog::getOpenFileName("~",
"Images (*.png *.jpg *.bmp)",
this,
"I like this like that",
"Choose your destiny");
}
La fonction ChargerImage() n'est qu'un test.


Enfin le main.cpp:
#include<qapplication.h>

#include"fenetre.h"


int main(int argc, char **argv)
{
QApplication maestro(argc, argv);
Fenetre MainWin;
MainWin.show();

MainWin.connect(&MainWin, SIGNAL(LastWindowClosed()), &MainWin, SLOT(quit()));
return maestro.exec();
}

Je lance la bête et là:
QObject::connect: No such slot QMainWindow::ChargerImage()
QObject::connect: (sender name: 'OpenBut')
QObject::connect: (receiver name: 'unamed')
QObject::connect: No such slot QMainWindow::quit()
QObject::connect: (sender name: 'QuitBut')
QObject::connect: (receiver name: 'unamed')
QObject::connect: No such signal QMainWindow::LastWindowClosed()
QObject::connect: (sender name: 'unamed')
QObject::connect: (receiver name: 'unamed')
La fenêtre est bien présente avec les deux boutons mais rien ne se passe.
De plus, même en quittant l'appli, le term continue a tourner dans le vide.

C'est sûrement simple, mais je vois pas d'où vient l'erreur :oops:

Réponses

  • Voici ton code corrigé :
    Dans fenetre.h il manque la macro Q_OBJECT nécessaire à l'utilisation des signaux et des slots :

    #ifndef FENETRE_H
    #define FENETRE_H

    #include<qwidget.h>
    #include<qmainwindow.h>
    #include<qpushbutton.h>


    class QPushButton;

    class Fenetre : public QMainWindow
    {
    Q_OBJECT
    public:
    Fenetre(QWidget *parent=0, const char *name=0);
    ~Fenetre();

    QPushButton *OpenBut;
    QPushButton *QuitBut;

    public slots:
    void ChargerImage();
    };

    #endif
    Voici main.cpp :

    #include<qapplication.h>
    #include"fenetre.h"

    int main( int argc, char** argv )
    {
    QApplication maestro( argc, argv );

    Fenetre MainWin;
    maestro.setMainWidget(&MainWin);

    MainWin.show();
    return maestro.exec();
    }
  • merci d'avoir répondu aussi vite :shock:

    j'avais pensé au Q_OBJECT mais j'avais oublié de refaire un qmake, avec juste un make ça ne marche pas (pourtant mon makefile ne devrait pas avoir changé)

    merci bien, ça marche maintenant si ce n'est ..

    pourquoi ne reconnait-il pas la fonction quit()? Fenetre n'hérite-elle pas de toutes les fonctions de QMainWindow?
  • (pourtant mon makefile ne devrait pas avoir changé)
    Si, ton Makefile a changé, car en rajoutant Q_OBJECT, ton fichier fenetre.h est passé par un utilitaire appelé moc qui créé un fichier supplémentaire moc_fenetre.cpp. Ce fichier est chargé de "lier" les macro Qt concernant les signaux et les slots afin de les faire accepter par le compilateur C++.

    Le slot quit() est reconnu mais le signal est lastWindowClosed() et non LastWindowClosed().
  • Je veux parler de la fonction qui() qui est appelée par le bouton QuiBut (dans fenetre.cpp)
    Ma classe Fenetre dispose bien d'un slot quit(), non?

    Edit: après réflexion c'est la fonction close() que je cherchais.
    Tout est bien qui fini bien ;)

    Merci encore
Connectez-vous ou Inscrivez-vous pour répondre.