0

我目前正在尝试编写一个小应用程序来进行实验等等。我将所有内容都写在自己的文件中(Menu -> menu.cpp 等)。现在我想创建一个菜单操作,这有效,但与操作交互不起作用。这就是我到目前为止所做的:

菜单.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!");
}

菜单.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 ../来自 Scratch 编写的 UI 应用程序 C++/src/ui/menu.cpp:11

我能做些什么来解决这个问题?

~ 一月

4

1 回答 1

0

类菜单:公共QObject

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

请参阅Qt5 - QObject文档:

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

connect接下来,您的通话中有一些混乱。这是静态connect函数的签名。

Qt5 - 静态 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->connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

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

我能做些什么来解决这个问题?

弄清楚您要做什么并做出适当的调用。

例如:将QAction信号连接到一个插槽,Menu然后调用静态函数,如下所示。

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

或者使用成员函数。

connect(newAct, SIGNAL(triggered()), SLOT(newFile()));
于 2015-04-25T15:47:36.413 回答