无法连接来自另一个 class 的插槽

Cannot connect slots from another class

我目前正在尝试编写一个用于实验等的小应用程序。我将所有内容都写在自己的文件中(菜单 -> 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: No such slot QObject::newFile() in ../from Scratch written UI app C++/src/ui/menu.cpp:11

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

~一月

class Menu : public QObject

Menu 是一个 QObject 但也需要使用 Q_OBJECT 宏。

请参阅 Qt5 - QObject 文档:

The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.

接下来,您的 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个参数(对象指针,信号,对象指针,signal/slot)并且第5个参数是默认的。

还有一个成员函数connect.

Qt5 - QObject::connect:

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

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

您的代码:

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

您正在调用 windowconnect 成员函数,但您正在为静态 connect 函数传递参数。

What can I do to fix this?

弄清楚你想做什么并做出适当的决定。

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

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

或者使用成员函数。

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