Qt主窗口菜单信号

问题描述:

我有处理QMainWindow的“核心”对象。
Core.h代码Qt主窗口菜单信号

class Core : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Core(QObject *parent = 0); 
    ~Core(); 
    void appInit(); 
    int getAuth(); 

public slots: 
    void appExit(); 

private slots: 
    void appMenuTriggered(QAction *action); 

private: 
    void preInit(); 
    MainWindow *mwnd; 
}; 

Core.cpp代码

Core::Core(QObject *parent) : QObject(parent) 
{ 
    qDebug() << "Core::Constructor called"; 
    preInit(); 
} 

Core::~Core() 
{ 
    delete mwnd; 
    qDebug() << "Core::Destructor called"; 
} 

int Core::getAuth() 
{ 
    LoginDialog *login = new LoginDialog(); 
    int r = login->exec(); 
    delete login; 
    return r; 
} 

void Core::appExit() // connected to qapplication aboutToQuit 
{ 
    qDebug() << "Core::appExit called"; 
} 

void Core::preInit() // called after getAuth im main.cpp 
{ 
    qDebug() << "Core::preInit called"; 
} 

void Core::appMenuTriggered(QAction *action) 
{ 
    qDebug() << "action triggered"; 
} 

void Core::appInit() 
{ 
    mwnd = new MainWindow(); 
    mwnd->show(); 
    qDebug() << "Core::appInit called"; 
} 

我想主窗口菜单栏中的信号连接到这样的核心插槽:

connect(mwnd->menuBar(), SIGNAL(triggered()), this, SLOT(appMenuTriggered())); 

但它不”工作。我新的C + +和Qt。如何连接这个? 或者,也许有更好的方法来处理其他程序部分的主窗口动作。

UPD 问题解决了。忘记包括QMenuBar

+0

如果你已经解决了你的问题,你应该发布它作为答案并接受它。这样,如果提到诊断错误消息,它将使其他人更受益于 – musefan

你必须在SIGNAL和SLOT参数(但没有参数名称)给出全功能规格。就像这样:

connect(mwnd->menuBar(), 
     SIGNAL(triggered(QAction*)), 
     this, 
     SLOT(appMenuTriggered(QAction*))); 

如果您在Qt Creator的调试这样的代码,该connect功能会写诊断错误信息发送给应用输出窗格中,当它没有找到一个信号或插槽。我建议您在解决问题之前先找到这些错误消息,以便将来知道将来的位置。信号和插槽错误很容易!

+0

+1。这些真的很有用。我想很多人会忽视他们。 –

+0

我得到QT以下错误: '呼叫没有匹配功能的核心::连接(QMenuBar *,为const char *,芯* const的,为const char *)' 候选人是:静态布尔QObject的: :connect(const QObject *,const char *,const QObject *,const char *,Qt :: ConnectionType)' –

+0

看起来像你从一个声明为'const'的成员函数调用'connect'(看'Core *错误消息中的const)。是对的吗? – TonyK