无法连接其他班级

时间:2015-04-25 15:35:53

标签: c++ qt signals slots

我目前正尝试为实验编写一个小应用程序。我在自己的文件中写了所有内容(菜单 - > menu.cpp等)。现在我想创建一个菜单操作,这可以工作,但与动作不相互作用。那是我到目前为止所做的:

menu.cpp

#include "menu.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>


void Menu::setupMenu(QMainWindow *window) {
    QMenuBar *mb = new QMenuBar();
    QMenu *fileMenu = new QMenu("File");
    QAction *newAct = new QAction("New...", window);
    window->connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
    fileMenu->addAction(newAct);
    mb->addMenu(fileMenu);
    window->setMenuBar(mb);
}

void Menu::newFile() {
    printf("hello world!");
}

menu.h

#ifndef MENU_H
#define MENU_H

#include <QObject>
#include <QMainWindow>
#include <QWidget>
#include <QMenuBar>

class Menu : public QObject
{
public:
    void setupMenu(QMainWindow *window);
private slots:
    void newFile();
};

#endif // MENU_H

但它没有打印出'hello world',我得到的唯一信息是:

  

QObject :: connect:没有这样的插槽QObject :: newFile()在../from Scratch编写的UI应用程序C ++ / src / ui / menu.cpp:11

我该怎么做才能解决这个问题?

~Jan

1 个答案:

答案 0 :(得分:0)

  

类菜单:public QObject

MenuQObject,但也需要使用Q_OBJECT宏。

请参阅Qt5 - QObject文档:

  

Q_OBJECT宏必须出现在类定义的私有部分中,该部分定义声明自己的信号和插槽,或使用Qt的元对象系统提供的其他服务。

接下来,您的connect电话中存在一些混淆。这是静态connect函数的签名。

Qt5 - static QObject::connect

  

QObject :: connect(const QObject * sender,const char * signal,const QObject * receiver,const char * method,Qt :: ConnectionType type = Qt :: AutoConnection)

你可以看到它需要5个参数(对象指针,信号,对象指针,信号/槽),第5个参数是默认的。

还有一个成员函数connect

Qt5 - QObject::connect

  

QObject :: connect(const QObject * sender,const char * signal,const char * method,Qt :: ConnectionType type = Qt :: AutoConnection)const

这需要4个参数(对象指针,信号,信号/槽),第4个参数是默认值。

您的代码:

  

window-&gt; connect(newAct,SIGNAL(triggered()),this,SLOT(newFile()));

您正在调用connect的{​​{1}}成员函数,但您正在为静态window函数传递参数。

  

我该怎么做才能解决这个问题?

弄清楚你正在尝试做什么并做出适当的电话。

例如:将connect信号连接到QAction中的一个插槽,然后按如下方式调用静态函数。

Menu

或使用会员功能。

connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));