В настоящее время я пытаюсь написать небольшое приложение для экспериментов и многое другое. Я пишу все в своем собственном файле (Menu -> 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
Но это не распечатка «Привет мир», единственное сообщение, которое я получаю, это:
QObject :: connect: такого слота нет QObject :: newFile () в ../от Scratch-приложении UI C ++ / src / ui / menu.cpp: 11
Что я могу сделать, чтобы это исправить?
Январь
Меню класса: общедоступный QObject
Menu
это QObject
но также необходимо использовать Q_OBJECT
макро.
Увидеть Qt5 — QObject документация:
Макрос Q_OBJECT должен появляться в закрытом разделе определения класса, который объявляет свои собственные сигналы и слоты или использует другие сервисы, предоставляемые мета-объектной системой Qt.
Далее, есть некоторая путаница в вашем connect
вызов. Вот подпись из статики connect
функция.
Qt5 — статический QObject :: connect:
QObject :: connect (const QObject * отправитель, сигнал const char *, const QObject * получатель, метод const char *, Qt :: ConnectionType type = Qt :: AutoConnection)
Вы можете видеть, что он принимает 5 параметров (указатель объекта, сигнал, указатель объекта, сигнал / слот), а 5-й параметр по умолчанию.
Также есть функция-член connect
,
QObject :: connect (const QObject * sender, const char * signal, метод const char *, 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()));