无法连接其他类的插槽

Cannot connect slots from another class

本文关键字:插槽 其他 连接      更新时间:2023-10-16

我目前正在尝试编写一个用于实验等的小应用程序。我把所有的东西都写在自己的文件中(菜单->菜单.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!");
}

菜单.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

但它并没有打印出"你好,世界",我得到的唯一信息是:

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

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

~ 1月

class菜单:公共QObject

MenuQObject,但也需要使用Q_OBJECT宏。

请参阅Qt5-QObject文档:

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

接下来,您的connect调用中出现了一些混乱。这是静态connect函数的签名。

Qt5-静态QObject::connect:

QObject::connect(const QObject*sender,const char*signal,const QOobject*receiver,const char*method,Qt::ConnectionType type=Qt:自动连接)

您可以看到它需要5个参数(对象指针、信号、对象指针、signal/slot),第5个参数是默认值。

还有一个成员函数connect

Qt5-Q对象::连接:

QObject::connect(const QObject*sender,const char*signal,const char*method,Qt::ConnectionType type=Qt:自动连接)const

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

您的代码:

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

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

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

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

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

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

或者使用成员函数。

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