2017-06-04 2 views
1

Lors de l'exécution de ma demande des messages d'avertissement apparaissent:
QMetaObject::connectSlotsByName: No matching signal for on_actionUndo_triggered(), QMetaObject::connectSlotsByName: No matching signal for on_actionRedo_triggered()Un message d'avertissement « Pas de signal correspondant pour » lors de l'exécution de ma demande

J'ai mis en œuvre la règle void on_objectName_signalName(signalParameters); au signal et la fente que j'ai créé et je ne sais pas pourquoi ces messages apparaissent, notez que le signal et la fente fonctionnent bien.

Déclaration:

class Widget : public QWidget { 
    Q_OBJECT 

public: 
    explicit Widget(QWidget *parent = 0); 
    ~Widget(); 

private: 
    Ui::Widget *ui; 
    QAction *actionUndo; 
    QAction *actionRedo; 

private slots: 
    void on_actionUndo_triggered(); 
    void on_actionRedo_triggered(); 
}; 

Définition:

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { 
    ui->setupUi(this); 
    QVBoxLayout *layout = new QVBoxLayout(this); 
    QMenuBar *menuBar = new QMenuBar(); 
    QMenu *editMenu = new QMenu("&Edit"); 
    menuBar->addMenu(editMenu); 

    this->actionUndo = new QAction("&Undo", editMenu); 
    this->actionUndo->setShortcut(QKeySequence::Undo); 
    QObject::connect(this->actionUndo, SIGNAL(triggered()), this, SLOT(on_actionUndo_triggered())); 

    this->actionRedo = new QAction("&Redo", editMenu); 
    this->actionRedo->setShortcut(QKeySequence::Redo); 
    QObject::connect(this->actionRedo, SIGNAL(triggered()), this, SLOT(on_actionRedo_triggered())); 

    editMenu->addAction(this->actionUndo); 
    editMenu->addAction(this->actionRedo); 

    this->layout()->setMenuBar(menuBar); 
} 

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


void Widget::on_actionUndo_triggered() { 

} 

void Widget::on_actionRedo_triggered() { 

} 
+0

essayer avec ma solution – eyllanesc

Répondre

2

L'avertissement survient parce que dans la fonction setupUi appelle la fonction connectSlotsByName.

void setupUi(QWidget *Widget) 
{ 
    [...] 
    QMetaObject::connectSlotsByName(Widget); 
} 

Selon la documentation:

vide QMetaObject :: connectSlotsByName (QObject * objet)

Recherches récursive pour tous les objets enfants de l'objet donné, et relie les signaux correspondant d'eux aux emplacements de l'objet qui suivent le suivant le formulaire:

void on_<object name>_<signal name>(<signal parameters>);

Ensuite, cette fonction recherche pour les objets actionUndo et actionRedo et ne les trouve pas, parce qu'ils ne sont pas créés, une solution simple est de les créer avant setupUi et passer un nom avec setObjectName:

actionUndo = new QAction("&Undo", this); 
actionUndo->setObjectName("actionUndo"); 
actionRedo = new QAction("&Redo", this); 
actionRedo->setObjectName("actionRedo"); 
ui->setupUi(this); 

Avec Dans cette configuration, vous n'aurez plus besoin de faire les connexions, c'est-à-dire que vous n'avez pas besoin d'implémenter la ligne suivante.

QObject::connect(this->actionUndo, SIGNAL(triggered()), this, SLOT(on_actionUndo_triggered())); 
QObject::connect(this->actionRedo, SIGNAL(triggered()), this, SLOT(on_actionRedo_triggered())); 

code complet:

.h

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit Widget(QWidget *parent = 0); 
    ~Widget(); 

private slots: 
    void on_actionUndo_triggered(); 
    void on_actionRedo_triggered(); 

private: 
    Ui::Widget *ui; 
    QAction *actionUndo; 
    QAction *actionRedo; 
}; 

Cpp

Widget::Widget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Widget) 
{ 
    actionUndo = new QAction("&Undo", this); 
    actionUndo->setObjectName("actionUndo"); 
    actionUndo->setShortcut(QKeySequence::Undo); 

    actionRedo = new QAction("&Redo", this); 
    actionRedo->setObjectName("actionRedo"); 
    actionRedo->setShortcut(QKeySequence::Redo); 

    ui->setupUi(this); 

    setLayout(new QVBoxLayout); 

    QMenuBar *menuBar = new QMenuBar(this); 
    QMenu *editMenu = new QMenu("&Edit"); 

    menuBar->addMenu(editMenu); 
    editMenu->addAction(actionUndo); 
    editMenu->addAction(actionRedo); 

    layout()->setMenuBar(menuBar); 

} 

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


void Widget::on_actionUndo_triggered() 
{ 
    qDebug()<<"undo"; 
} 

void Widget::on_actionRedo_triggered() 
{ 
    qDebug()<<"redo"; 
}