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 26/12/2019, à 14:12

james wood

Image sur qtcreator 2

Bonjour chers développeurs

J'ai déjà posté un message sur ce forum il y a quelque mois, pour demander comment afficher des images dans une fenêtre à l'aide d'une fonction, n'étant pas le constructeur de la fenêtre lui même( de sorte à pouvoir afficher des images après librement une fois la fenêtre créé)

Ce à quoi l'on ma répondu qu'il fallait un widget pour contenir mon image en question (par exemple un de type QLabel).

Ceci dit un problème m'est venu, j'ai en effet pu créer une fonction qui faisait apparaître un Label sur ma fenêtre au moment ou je le voulais, cette fonction prend pour argument un objet de type QPixmap, le problème étant que je n'arrive pas à incruster l'Objet QPixmap dans le label en question, je ne trouve pas de méthode du Label ayant pour nom "label.setPixmap(QPixmap* pixmap)"
Je me suis alors documenté sur des classes similaires (comme QFrame) mais je ne trouve que des méthodes ayant des rôles quelques peut différents (setFrameShape, setFrameRect)

J'aimerai donc savoir que dois-je faire, y a-t-il un widget qui correspond à ce que je recherche ? Dois-je créer mon propre QWidget avec une classe et des héritages (dans ce cas que faire)

Et autant demander tout de suite car je risque d'avoir cet autre problème à l'avenir: Si je souhaite faire bouger mes Images dans me fenêtre, dois-je utiliser une autre méthode ? Mais pour l'instant c'est mon premier problème qui m'importe le plus, ne répondez pas au deuxième si vous ne pouvez pas il sera plutôt pour une étape suivante


Merci d'avance de vos réponses, votre savoir à tous m'aide considérablement.

Dernière modification par james wood (Le 27/12/2019, à 17:13)

Hors ligne

#2 Le 26/12/2019, à 14:14

james wood

Re : Image sur qtcreator 2

Veuillez m'excuser pour la faute à la  première phrase de mon message ceci-dit.

Hors ligne

#3 Le 26/12/2019, à 18:08

kamaris

Re : Image sur qtcreator 2

Pour la faute dans ton premier message, tu peux la corriger en éditant ce message (lien en bas à droite du message).
Pour le widget QLabel, il a bien une méthode setPixmap : https://doc.qt.io/qt-5/qlabel.html#pixmap-prop
Peut-être devrais-tu donner un bout de code pour qu'on voit mieux de quoi tu parles et ce qui ne va pas.

Hors ligne

#4 Le 26/12/2019, à 21:53

NicoApi73

Re : Image sur qtcreator 2

Bonjour,

Tu fais référence à cette discussion : ./viewtopic.php?id=2044959

Voici un exemple fait à l'arrache :

Header mainwindows.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPixmap>

#define S_WIDTH 1365 // Picture width
#define S_HEIGHT 768 // Picture height

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QPixmap myPixmap1,myPixmap2;
    bool myPixmap1IsDisplayed;
};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"

#include <QApplication>

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

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // Pixmaps initi
    myPixmap1 = QPixmap (":/new/pictures/Pictures/P_20171225_151848.jpg").scaled(QSize(S_WIDTH,S_HEIGHT),Qt::KeepAspectRatio);
    myPixmap2 = QPixmap (":/new/pictures/Pictures/P_20171225_163332.jpg").scaled(QSize(S_WIDTH,S_HEIGHT),Qt::KeepAspectRatio);

    // First picture displayed
    ui->label->setPixmap(myPixmap1);
    myPixmap1IsDisplayed = true;
}

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


void MainWindow::on_pushButton_clicked()
{
    // Pictures swap 

    if (myPixmap1IsDisplayed)
    {
        ui->label->setPixmap(myPixmap2);
        myPixmap1IsDisplayed = false;
    }
    else
    {
        ui->label->setPixmap(myPixmap1);
        myPixmap1IsDisplayed = true;
    }
}

En plus de ça, j'ai un fichier ressource (qrc) contenant les 2 images et un fichier forms (ui) contenant la vue, mainwindow.ui.

La vue est constituée d'un QLabel (appelé label) et d'un QPushButton (appelé pushButton)

L'image 1 est affichée au début (j'aurais pu le faire sur un évènement) et en cliquant sur le push, les images sont permutées.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

james wood a écrit :

Ceci dit un problème m'est venu, j'ai en effet pu créer une fonction qui faisait apparaître un Label sur ma fenêtre au moment ou je le voulais, cette fonction prend pour argument un objet de type QPixmap, le problème étant que je n'arrive pas à incruster l'Objet QPixmap dans le label en question, je ne trouve pas de méthode du Label ayant pour nom "label.setPixmap(QPixmap* pixmap)"

La méthode en question existe. Par contre, il faut la chercher dans les slots (Public Slots). Tu peux donc l'utiliser comme une méthode standard ou comme un slot, avec un signal adequat :
https://doc.qt.io/qt-5/qlabel.html#pixmap-prop

Attention, ce n'est pas un pointeur qu'il faut passer, mais directement l'objet de type QPixmap

Dernière modification par NicoApi73 (Le 26/12/2019, à 22:59)

Hors ligne

#5 Le 27/12/2019, à 17:12

james wood

Re : Image sur qtcreator 2

Merci pour vos nombreuses réponses.
En effet la fonction setpixmap existe bel et bien mais elle se trouve dans les slots et non pas dans les fonctions sur la documentation officielle, voilà pourquoi je ne l'avais pas vue,

Mon morceau de code ne fonctionnant pas est
void MainWindow::display(VisualObject* objectv)
{
    QLabel support(this);
    support.setPixmap(objectv->texture);
}

VisualObject est une classe que j'ai créé ayant pour argument "texture" qui est de type QPixmap
L'erreur retournée par le debugger est "no maching function for call to "QLabel::SetPixmap((QPixmap*&)

j'ai vu sur le code de NicoApi73 qu'une syntaxe correcte du code serai ui->support->setPixmap

j'ai alors essayé
void MainWindow::display(VisualObject* objectv)
{
    QLabel support(this);
    ui->support->setPixmap(objectv->texture);
}

ce à quoi le debugger me répond que "ui" n'a pas mon Label de nom "support"
j'ai alors pensé que "label" était un objet que ui contenait par défaut mais le debugger me retourne la même erreur
j'ai regardé le code encore une fois Mais je ne vois pas ou ce fameu "label" est initié

j'ai relu vos message et j'ai vu qu'il ne fallait pas passer de pointeur à la fonction setpixmap mais directement l'objet lui même (Ah)

j'ai alors effectué un bon nombre de ctrl+z pour revenir à mon premier code et le réécrire comme ceci
void MainWindow::display(VisualObject objectv)
{
    QLabel support(this);
    support.setPixmap(objectv.texture);

}

et ça ne marche toujours pas
j'ai essayé d'autres codes comme
void MainWindow::display(VisualObject objectv)
{
    QLabel support(this);
    ui->support.setPixmap(objectv.texture);

}

ou

void MainWindow::display(VisualObject objectv)
{
    QLabel support(this);
    ui->label->setPixmap(objectv.texture);

}

et rien n'y fait, je ne sais pas trop si je me suis emméllé dans les pointeurs ou les classes ou quelque chose comme ça, pouvez-vous continuer de m'éclairer ?

Hors ligne

#6 Le 27/12/2019, à 17:38

kamaris

Re : Image sur qtcreator 2

Il faut que tu utilises les balises code pour mettre en forme ton message (les chevrons <> dans la barre d'outils de rédaction), car là c'est illisible !

Hors ligne

#7 Le 27/12/2019, à 18:53

NicoApi73

Re : Image sur qtcreator 2

kamaris a écrit :

Il faut que tu utilises les balises code pour mettre en forme ton message (les chevrons <> dans la barre d'outils de rédaction), car là c'est illisible !

+1

Commence par faire simple en utilisant les classes existantes.

Je crains que tu n'utilises la programmation orientée objet à contre emploi en violant le principe d'encapsulation des données, car je crois comprendre que ce que tu appelles arguments d'une classe soit les attributs...

Si tu veux qu'on t'aide, il nous faudrait l'ensemble de ton code, car là, je ne vois pas ce que tu fais.

Hors ligne

#8 Le 28/12/2019, à 10:48

NicoApi73

Re : Image sur qtcreator 2

Bonjour,

Je n'ai pas réussi à faire plus simple que ci-dessous, sans passer par les outils de développement intégrés. Il n'y a pas de fichier ui :
Fichier qmake (.pro)

QT       += widgets

SOURCES += \
    main.cpp

Fichier source (main.cpp)

#include <QApplication>
#include <QLabel>
#include <QPixmap>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label;

    label.setScaledContents(true); // Pour que l'image remplisse le QLabel
    label.showMaximized(); // Pour afficher le QLabel en prenant tout l'écran
    label.setPixmap(QPixmap ("/home/nicolas/Documents/Programmation/Qt_Pictures/Simple_Qt_Picture/Simple_Qt_Picture/Pictures/P_20171225_151848.jpg")); // Pour charger l'image en fond

    return app.exec();
}

Pour que ce soit exécutable chez toi, il te faut juste modifier le chemin et le nom de l'image.

J'ai positionné setPixmap après la méthode .showMaximized pour te montrer que tu peux changer l'image quand tu veux.

Tu peux créer plusieurs objets Pixmap et les utiliser dans setPixmap. Par exemple :

    QPixmap myPixmap ("/home/nicolas/Documents/Programmation/Qt_Pictures/Simple_Qt_Picture/Simple_Qt_Picture/Pictures/P_20171225_151848.jpg");
    label.setPixmap(myPixmap);

Hors ligne

#9 Le 28/12/2019, à 20:57

james wood

Re : Image sur qtcreator 2

Merci à tous de m'avoir répondu.

Finalement grâce à vos message j'ai pu corriger mon erreur : l'objet passé en argument était un pointeur et il fallait un objet entier
Il n'y avait pas à taper "ui->" ou "ui." dans le code, je pouvais utiliser le label créé dans la fonction elle même mais il fallait juste modifier la nature de l'objet "texture" dans la classe d'où il venait, pour ce qui est de violer les règles de la programmation orienté objet ce code est un test que je modifie sans cesse pour essayer de nouvelles choses ou pour l'améliorer donc je vais sûrement modifier ceci également à l'avenir bien que je ne sache pas si l'on peut retourner un objet QPixmap avec une fonction int,
Excusez-moi cependant de ne pas savoir utiliser les balises "<>" pour le code, je vais me renseigner par la suite pour savoir comment les utiliser
Vos réponses m'ont toutes été utiles désolé de vous avoir fait perdre votre temps avec mon code encore si peu aboutis, je vous rappellerai quand j'aurai de nouvelles questions/de nouveaux problèmes sûrement plus intéressants que celui-ci.

(le code sans erreur est celui-ci)
//fichier visual object.h
class VisualObject : public Motorobject
{
public:

    VisualObject(int ID,QPixmap owo,QMainWindow* support);
    ~VisualObject();
    QPixmap texture;
protected:
    int id;
};
//fonction qui posait problème
void MainWindow::display(VisualObject objectv)
{
    QLabel support(this);
    support.setPixmap(objectv.texture);

}

À peut-être une autre conversation

Hors ligne

#10 Le 28/12/2019, à 21:13

NicoApi73

Re : Image sur qtcreator 2

Je te conseille de relire le post #7

Dans ton code, texture est un attribut de type QPixmap. Tu y accèdes directement, sans respecter le principe d'encapsulation. l'attribut texture devrait être déclaré en private en non pas en public. Et tu y accèdes au travers d'accesseurs...

Hors ligne