IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Ouvrir une QFiledialog lors d'un appui sur un bouton QPushButton

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    septembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : septembre 2016
    Messages : 22
    Points : 27
    Points
    27
    Par défaut Ouvrir une QFiledialog lors d'un appui sur un bouton QPushButton
    bonjour,

    Après avoir suivi le tutoriel sur Qt (notamment sur l'utilisation des signaux et slots), j'ai essayé de faire un petit widget personnalisé.

    je voulais essayer de réaliser l'élément suivant :

    - un QLabel avec un text

    - Un QLineEdit pour afficher un chemin vers un fichier

    - Un bouton "Parcourir"

    l'appui sur le bouton "parcourir" déclenche l'ouverture d'un Qfiledialog::getOpenFileName qui est ensuite découpé en nom de fichier et chemin. ces deux éléments étant stockés dans l'object créé sour forme de QString.

    lorsque je teste cet élément, graphiquement, cela correspond bien.

    Par contre, l'appui sur le bouton "parcourir" ne déclenche pas la fonction "SelectFile()" qui est sensé déclencher l'affichage du QFileDialog.

    dans le constructeur de l'objet, j'ai pourtant déclaré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(button, SIGNAL(Clicked()), this, SLOT(SelectFile()));
    Donc, je m'attendrais avec cette ligne à ce que lors d'un clique sur le bouton, la fonction selectfile de mon objet soit déclenchée.

    Hors, mon code ne rentre jamais dans la fonction SelectFile.

    Je ne comprend pas pourquoi. quelle erreur ai-je pu commettre pour aboutir à ce fonctionnement ?

    merci de votre aide,



    voici le .h de mon object :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #ifndef UISELECTFILENAMEH_H
    #define UISELECTFILENAMEH_H
     
    #include <QWidget>
    #include <QPushButton>
    #include <QLabel>
    #include <QFileDialog>
    #include <QFileInfo>
    #include <QHBoxLayout>
    #include <QLineEdit>
     
    class UISelectFileNameH : public QWidget
    {
        Q_OBJECT
     
    public:
        UISelectFileNameH(QString,QWidget *parent = 0);
     
    public slots:
        void SelectFile();
     
    private:
        QString FilePathName;
        QString FileName;
        QString FilePath;
        QPushButton *button;
        QLabel *lbl;
        QLineEdit *ledit;
    };
    #endif // UISELECTFILENAMEH_H
    Voici le .cpp associé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include "uiselectfilenameh.h"
     
    UISelectFileNameH::UISelectFileNameH(QString label,QWidget *parent): QWidget(parent)
    {
        // définition du widget principal
        //QWidget *window = new QWidget;
     
        //Definition des éléments graphiques
        button = new QPushButton(tr("Parcourir"), this);
        button->setFont(QFont("Times", 18, QFont::Bold));
     
        lbl = new QLabel(label, this);
        lbl->setFont(QFont("Times", 18, QFont::Bold));
     
        ledit = new QLineEdit(this);
        ledit->setText(FilePathName);
     
        FilePathName="";
        connect(button, SIGNAL(Clicked()), this, SLOT(SelectFile()));
     
        // Positionnement des éléments
        QHBoxLayout *layout = new QHBoxLayout(this);
        layout->addWidget(lbl);
        layout->addWidget(ledit);
        layout->addWidget(button);
    }
     
    void UISelectFileNameH::SelectFile()
    {
        FilePathName = QFileDialog::getOpenFileName(this, "Sélectionner");
        QFileInfo Temp(FilePathName);
        FilePath = Temp.filePath();
        FileName = Temp.fileName();
    }
    Et voici le main pour etre complet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // include éléments graphiques
    #include "UI\uiselectfilenameh.h"
     
    #include <QDebug>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
       // interface graphique
       //QCoreApplication app(argc, argv);
       QApplication app(argc, argv);
     
       //MainWidget widget;
       UISelectFileNameH *test1 = new UISelectFileNameH("Lecture : ");
       //widget.show();
       test1->show();
     
       return app.exec();
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Je viens de faire un test rapide avec creation QtWidgetApplication hérité de QWidget.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    .h
    #pragma once
     
    #include <QWidget>
     
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
     
    class Widget : public QWidget
    {
        Q_OBJECT
     
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
     
    public slots:
        void selectedFile();
     
    private:
        Ui::Widget *ui;
    };
     
    .cpp
     
    #include "widget.h"
    #include "ui_widget.h"
     
    #include <QPushButton>
    #include <QFileDialog>
    #include <QHBoxLayout>
     
    Widget::Widget(QWidget *parent)
        : QWidget(parent), ui(new Ui::Widget)
    {
        ui->setupUi(this);
     
        QPushButton* button = new QPushButton("search file", this);
        QHBoxLayout* layout = new QHBoxLayout(this);
     
     
        layout->addWidget(button);
     
        connect(button, &QPushButton::clicked, this, &Widget::selectedFile);
     
    }
     
    void Widget::selectedFile()
    {
        qDebug() << "click button";
        QString fileName = QFileDialog::getOpenFileName(this, tr("My title"), "",tr("All Files (*)"));
    }
     
    Widget::~Widget()
    {
        delete ui;
    }
    Aucun problème de mon coté.
    Regarde cette exemples : https://doc.qt.io/qt-6/tutorials-addressbook.html
    Dernière modification par Invité ; 20/09/2021 à 18h34.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par nicolas2333 Voir le message
    connect(button, SIGNAL(Clicked()), this, SLOT(SelectFile()));
    Il faut faire attention à la casse : le signal s'écrit « clicked » avec une minuscule.

    Note que tu as dû avoir un message d'erreur « No such signal » durant l'exécution et que c'est l'une des raisons pour laquelle tu devrais abandonner ces macros SIGNAL/SLOT obsolètes et te tourner vers la nouvelle syntaxe qui t'aurait donné une erreur à la compilation, comme te l'a montré ManOfStyle. Cf. ce sujet de FAQ pour en savoir plus.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    septembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : septembre 2016
    Messages : 22
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup.

    Effectivement avec la nouvelle syntaxe, ce code fonctionne correctement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage d'une fenêtre lors de l'appui sur un bouton
    Par Andrasius dans le forum Débuter
    Réponses: 2
    Dernier message: 08/03/2017, 18h39
  2. Réponses: 16
    Dernier message: 08/08/2014, 18h37
  3. Réponses: 1
    Dernier message: 14/06/2011, 21h37
  4. Réponses: 3
    Dernier message: 30/03/2009, 19h23
  5. Execution d'une fonction lors de l'appui sur CTRL+ALT+I
    Par cyberlewis dans le forum Windows
    Réponses: 4
    Dernier message: 17/03/2004, 02h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo