2016-11-19 3 views
0

dans mon programme Qt J'ai besoin de la boîte de dialogue pour envoyer un signal à un slot dans la fenêtre principale. J'ai établi la connexion correctement au meilleur de ma connaissance et il ne me donne pas d'erreurs pendant la compilation ou l'exécution, mais pour une raison quelconque, il ne fait rien lorsque le bouton qui est censé activer le signal est cliqué. Pourquoi cela arrive-t-il?Les signaux et les slots ne fonctionnent pas en qt

beastiary.h (en-tête de mainwindow)

namespace Ui { 
class Beastiary; 
} 

class Beastiary : public QMainWindow 
{ 
    Q_OBJECT 

public: 

    explicit Beastiary(QWidget *parent = 0); 

    Ui::Beastiary *ui; 

    QStringList MyList; 

    ~Beastiary(); 

public slots: 
    void refresh(); 

private slots: 

    void on_pushButton_clicked(); 

    void on_listWidget_itemClicked(QListWidgetItem); 

    void on_pushButton_2_clicked(); 

    void on_pushButton_3_clicked(); 

beastiary.cpp (mainwindow fichier cpp)

Beastiary::Beastiary(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::Beastiary) 
{ 
    ui->setupUi(this); 
    Dialog dialog; 
    connect(&dialog, SIGNAL(gorefresh()),this, SLOT(refresh())) ; 


    void Beastiary::refresh() 
    { 
     qDebug() << "recieved"; 
     ui->listWidget->clear(); 
     QString path = "C:/Program Files/Bargest/bin"; 
     QDir myPath(path); 
     myPath.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); 
     MyList = myPath.entryList(); 
     ui->listWidget->addItems(MyList); 
    } 

de dialog.h

namespace Ui { 
class Dialog; 

} 

class Dialog : public QDialog 
{ 
    Q_OBJECT 


public: 

    explicit Dialog(QWidget *parent = 0); 
    ~Dialog(); 


signals: 
    void gorefresh(); 

private slots: 
    void on_pushButton_done_clicked(); 

    void on_pushButton_cancel_clicked(); 

    void on_pushButton_clicked(); 

private: 
    Ui::Dialog *ui; 

dialog.cpp

void Dialog::on_pushButton_done_clicked() 
{  
    emit gorefresh(); 
} 

J'ai quitté en grande partie du code qui viennent rien à voir avec le mécanisme des signaux réels et les créneaux horaires en jeu ici.

+0

Où vous exécutez la boîte de dialogue ? – krzaq

+0

'void Beastiary :: on_pushButton_clicked() { Dialog * ad = nouveau Dialogue (this); ad-> show(); } 'Dans la fenêtre principale, c'est le bouton poussoir qui ouvre la boîte de dialogue – Nick

+0

Voir http://stackoverflow.com/q/26422154/1421332 – Silicomancer

Répondre

2

Vous connectez uniquement l'instance de boîte de dialogue que vous avez créée localement dans le constructeur de Bestiary, qui est hors de portée à la fin du constructeur.

connect se connecte instances, pas les classes . Cela signifie que vous devez connect chaque boîte de dialogue créé:

void Beastiary::on_pushButton_clicked() { 
    Dialog* ad = new Dialog(this); 
    connect(ad, SIGNAL(gorefresh()), this, SLOT(refresh())); 
    ad->show(); 
} 

Pendant son séjour à, vous devriez sérieusement envisager d'utiliser la syntaxe de connexion de type sécurisé fourni avec Qt 5:

void Beastiary::on_pushButton_clicked() { 
    Dialog* ad = new Dialog(this); 
    connect(ad, &Dialog::gorefresh, this, &Bestiary::refresh)); 
    ad->show(); 
} 
+0

Et aussi pendant que vous y êtes, vous devriez sérieusement envisager d'utiliser des connexions explicites pour ces signaux d'interface utilisateur , au lieu de s'appuyer sur la fonction "connecter par nom" fragile –

+0

@KevinKrammer cela vous dérangerait-il de développer? – krzaq

+1

Les noms de slots comme 'on_pushButton_clicked()' sont une indication que le programme utilise les fonctionnalités "connect by name", c'est-à-dire qu'il y a un élément UI appelé "pushButton" avec un signal clicked() ' 'ui-> setupUi()' essaie de trouver un nom d'emplacement correspondant auquel se connecter. Ceci est très fragile car il repose sur des noms d'éléments, par ex. Si ce bouton était renommé, la fente cesserait de fonctionner. Faire explicitement des appels 'connect()' dans le code évite cela, car toute modification du nom du widget entraînerait un changement du nom de la variable et rendrait la connexion échouée –