2015-11-23 1 views
0

J'essaie de créer une interface graphique basée sur Qt, et je veux connecter un élément de menu avec une fonction, je veux dire qu'après avoir cliqué sur un élément de menu, cette fonction sera appelée. Je l'ai essayé comme ça, mais ça ne marche pas, après avoir cliqué sur le menu idem, je ne vois pas mon empreinte cout. Qu'est ce que je fais mal?Comment connecter une action Qt avec une fonction

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

    connect(ui->actionSave_Map, SIGNAL(triggered()), this, SLOT(saveMap())); 

} 

void MainWindow::saveMap(map& my_map) 
{ 
    std::cout << "clicked to save" << std::endl; 
    my_map.saveMap(); 
} 

.h

#include <QMainWindow> 
#include "map.h" 

namespace Ui 
{ 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    void setMapPreferences(); 
    void generateMap(); 
    void drawMap(); 

public slots: 
    void saveMap(map& my_map); 

private: 
    Ui::MainWindow *ui; 


}; 

#endif // MAINWINDOW_H 

dans la console il y a une erreur après un clic:

Object::connect: No such slot MainWindow::saveMap(map& my_map) in ../map_generator/mainwindow.cpp:19 
+0

est 'saveMap()' une fente? Vérifiez-vous la sortie sur la console? – Claudio

+0

Oui, je vérifie la sortie sur une console, et je pense que c'est un slot, j'ai ajouté le fichier .h à mon poste. –

+1

'Q_DECLARE_METATYPE (map);' - près de la déclaration de votre carte. Et supprimez un argument de l'emplacement 'saveMap' (ou utilisez' QSignalMapper'). –

Répondre

2

Dans ce cas, il est simple lorsque l'utilisation lambada. Remplacer:

connect(ui->actionSave_Map, SIGNAL(triggered()), this, SLOT(saveMap()));

avec

connect(ui->actionSave_Map, &QAction::triggered, [=]() { 
    saveMap(my_map); 
}); 

après cela, vous que vous ajoutez à votre fichier QMAKE_CXXFLAGS += -std=c++0x.pro