Не удается подключить слоты из другого класса

В настоящее время я пытаюсь написать небольшое приложение для экспериментов и многое другое. Я пишу все в своем собственном файле (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

Что я могу сделать, чтобы это исправить?

Январь

0

Решение

Меню класса: общедоступный 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,

Qt5 — QObject :: 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()));
0

Другие решения


По вопросам рекламы [email protected]