无法连接来自另一个 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
.
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()));
您正在调用 window
的 connect
成员函数,但您正在为静态 connect
函数传递参数。
What can I do to fix this?
弄清楚你想做什么并做出适当的决定。
例如:将 QAction
信号连接到 Menu
中的插槽,然后按如下方式调用静态函数。
connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
或者使用成员函数。
connect(newAct, SIGNAL(triggered()), SLOT(newFile()));
我目前正在尝试编写一个用于实验等的小应用程序。我将所有内容都写在自己的文件中(菜单 -> 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
.
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()));
您正在调用 window
的 connect
成员函数,但您正在为静态 connect
函数传递参数。
What can I do to fix this?
弄清楚你想做什么并做出适当的决定。
例如:将 QAction
信号连接到 Menu
中的插槽,然后按如下方式调用静态函数。
connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
或者使用成员函数。
connect(newAct, SIGNAL(triggered()), SLOT(newFile()));