2017-06-04 65 views
1

在执行我的应用程序的一些警告信息显示“无匹配的信号”:
QMetaObject::connectSlotsByName: No matching signal for on_actionUndo_triggered()QMetaObject::connectSlotsByName: No matching signal for on_actionRedo_triggered()一条警告消息在执行我的应用程序时

我已经实现了规则void on_objectName_signalName(signalParameters);给我创造了信号和槽我不知道为什么会出现这些信息,请注意信号和插槽工作正常。

声明:

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(); 
}; 

定义:

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

试图用我的解决办法 – eyllanesc

回答

2

警告的产生是因为内部的功能setupUi调用函数connectSlotsByName

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

根据文档:

无效QMetaObject :: connectSlotsByName(QObject的*对象)

递归搜索给定对象的所有子对象,并 匹配连接从他们的信号到 以下形式的物品槽位:

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

那么这个函数查找对象actionUndoactionRedo并没有找到他们,因为他们不创建,一个简单的解决方案是setupUi之前创建它们,并通过一个名字与setObjectName

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

随着这个配置你将不再需要建立连接,即你不需要实现下一行。

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

完整代码:

.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"; 
}