我目前正尝试为实验编写一个小应用程序。我在自己的文件中写了所有内容(菜单 - > 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
答案 0 :(得分:0)
类菜单:public QObject
Menu
是QObject
,但也需要使用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
。
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()));