Probleme d'execution de QObject::connect()



  • salut. j'ai un probleme quand j'execute ma fenetre de dialogue. les deux Qlineedit de la fenetre principale recupere en meme temps la valeur du widget dialogue. Moi je veux le qlineedit dans lequel j'ai double clique reçoit seul la valeur envoyée.
    Merci de votre aide.
    Mon code:
    namespace Ui {
    class Dialog;
    }

    class Dialog : public QDialog
    {
    Q_OBJECT

    public:
    explicit Dialog(QWidget *parent = nullptr);
    void ajouterRegion();
    //QString varText =""; //texte à récupèrer
    ~Dialog();

    signals:
    void envoyerText(const QString &texte);

    private slots:

    void on_m_btnbox_accepted();
    

    private:
    Ui::Dialog *ui;

    };
    #endif // DIALOG_H

    #ifndef FORMPRINCIPAL_H
    #define FORMPRINCIPAL_H

    #include <QWidget>
    #include <QEvent>
    #include <QString>
    #include <QEvent>
    #include <QMouseEvent>
    #include "dialog.h"

    namespace Ui {
    class FormPrincipal;
    }

    class FormPrincipal : public QWidget
    {
    Q_OBJECT

    public:
    explicit FormPrincipal(QWidget *parent = nullptr);

    ~FormPrincipal();
    

    protected:
    bool eventFilter(QObject *obj, QEvent *event);
    signals:
    void doubleClick();

    private slots:
    void on_m_btnfermer_clicked();
    void ouvrirFenDialog() const;

    private:
    Ui::FormPrincipal *ui;
    Dialog *m_dialog;
    };

    #endif // FORMPRINCIPAL_H
    #include "formprincipal.h"
    #include "ui_formprincipal.h"

    FormPrincipal::FormPrincipal(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormPrincipal)
    {
    ui->setupUi(this);
    ui->m_prenoms->installEventFilter(this);
    ui->m_nom->installEventFilter(this);

    m_dialog = new Dialog;
    QObject::connect(this, SIGNAL(doubleClick()),this,SLOT(ouvrirFenDialog()));
    QObject::connect(m_dialog, SIGNAL(envoyerText(const QString &)),
                     ui->m_prenoms, SLOT(setText(const QString &)));
    
    QObject::connect(m_dialog, SIGNAL(envoyerText(const QString &)),
                     ui->m_nom, SLOT(setText(const QString &)));
    

    }

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

    void FormPrincipal::on_m_btnfermer_clicked()
    {
    qApp->quit();
    }

    void FormPrincipal::ouvrirFenDialog() const {

    m_dialog->exec();
    

    }

    /**

    • @brief FenPrincipale::eventFilter
    • @param obj
    • @param ev
    • @return
    • Cette fonction permet de recupèrer l'évènement "Double-click" sur un QWidget de notre fenêtre.
    • On vérifie d'abord que le type d'OBJET est un QWidget et l'évènement un double-click et on laisse
    • l'evenement continué sur le QWidget concerné.
    • NB:Il faut dans ta fenêtre Executer un filtre qui identifie le double-click sur les QWidgets concernés
      */

    bool FormPrincipal::eventFilter(QObject *obj, QEvent *ev){

    //Vérifier que l'évènement est un double-click
    if (ev->type()==QEvent::MouseButtonDblClick){
    
          //On émet un signal qui permettra d'executer le SLOT "ouvrirFenDialog"
          emit doubleClick();
          //On laisse la transmission du SIGNAL continué en retournant "False"
          return false;
    }
    else {
        //On continue le traitement des autres évènements
        return  QObject::eventFilter(obj,ev);
    }
    

    }

    #include "dialog.h"
    #include "ui_dialog.h"

    Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
    {
    ui->setupUi(this);
    this->setCursor(Qt::PointingHandCursor);
    this->setWindowModality(Qt::ApplicationModal);
    this->setWindowIcon(QIcon(QCoreApplication::applicationDirPath()+ "/ok.png"));

    //Charger la liste des régions
    this->ajouterRegion();
    
    QObject::connect(ui->m_btnbox,SIGNAL(rejected()),this,SLOT(reject()));
    

    }

    Dialog::~Dialog()
    {
    delete ui;

    }
    void Dialog::ajouterRegion(){
    ui->m_listChoix->addItem("Dakar");
    ui->m_listChoix->addItem("Diourbel");
    ui->m_listChoix->addItem("Fatick");
    ui->m_listChoix->addItem("Kaolack");
    ui->m_listChoix->addItem("Kédougou");
    ui->m_listChoix->addItem("Kolda");
    ui->m_listChoix->addItem("Louga");
    ui->m_listChoix->addItem("Matam");
    ui->m_listChoix->addItem("Saint-Louis");
    ui->m_listChoix->addItem("Sédhiou");
    ui->m_listChoix->addItem("Tambacouda");
    ui->m_listChoix->addItem("Thiès");
    ui->m_listChoix->addItem("Ziguinchor");
    }

    void Dialog::on_m_btnbox_accepted()
    {
    //Envoi du signal par la Fenêtre Dialog
    emit envoyerText(ui->m_listChoix->currentText());
    QDialog::accept();
    }



  • Il serait plus simple de faire une classe dérivée de QLineEdit et de faire un override de la méthode mouseDoubleClickEvent.

    // lineedit.h
    #ifndef LINEEDIT_H
    #define LINEEDIT_H

    #include <QLineEdit>

    class LineEdit : public QLineEdit
    {
    Q_OBJECT
    public:
    explicit LineEdit(QWidget *parent = nullptr);

    protected:
    void mouseDoubleClickEvent(QMouseEvent* event) override;
    };

    #endif // LINEEDIT_H

    // lineedit.cpp
    #include "lineedit.h"
    #include <QInputDialog>

    LineEdit::LineEdit(QWidget *parent)
    : QLineEdit(parent)
    { }

    void LineEdit::mouseDoubleClickEvent(QMouseEvent*)
    {
    QString valeur = QInputDialog::getText(this, "Entrez une valeur:", "Valeur");
    setText(valeur);
    }


Log in to reply