2015-04-25 5 views
0

В настоящее время я пытаюсь написать небольшое приложение для экспериментов и многое другое. Я пишу все в своем собственном файле (Меню -> menu.cpp и т. Д.). Теперь я хочу создать действие меню, это работает, но взаимодействие с действием doesnt. То, что я сделал до сих пор:Не удается подключить слоты из другого класса

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() in ../from Scratch написанное приложение UI C++/src/ui/menu.cpp: 11

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

~ Ян

+0

Q_SLOTS? Q_OBJECT? – user3528438

ответ

0

класс Menu: общественное QObject

Menu является QObject, но также необходимо использовать Q_OBJECT макрос.

См Qt5 - QObject документацию:

макрос Q_OBJECT должен появиться в частном разделе определения класса, объявляющего свои собственные сигналы и слоты или который использует другие услуги, предоставляемые системой метаобъектной Qt.

Дальше, есть некоторая путаница в вашем звонке connect. Вот подпись статической функции connect.

Qt5 - static QObject::connect:

QObject :: подключить (константный QObject * отправителя, константный символ * сигнал, константный QObject * приемник, Const символ * метод, Qt :: тип ConnectionType = Qt :: AutoConnection)

Вы можете видеть, что он принимает 5 параметров (указатель объекта, сигнал, указатель объекта, сигнал/слот), а 5-й параметр по умолчанию.

Существует также функция-член connect.

Qt5 - QObject::connect:

QObject :: подключить (константный QObject * отправителя, константный символ * сигнал, Const символ * метод, Qt :: тип ConnectionType = Qt :: AutoConnection) константный

Это занимает 4 параметра (указатель объекта, сигнал, сигнал/слот), а 4-й параметр по умолчанию.

Ваш код:

window-> подключения (newAct, SIGNAL (срабатывает()), это, SLOT (NewFile()));

Вы называете функцию window в connect член, но вы передаете параметры статической connect функции.

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

Укажите, что вы пытаетесь сделать, и сделайте соответствующий звонок.

Например: подключите сигнал QAction к слоту в Menu, затем либо вызовите статическую функцию следующим образом.

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

Или используя функцию-член.

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

Когда я добавляю ** Q_OBJECT ** в файл заголовка, я получаю ошибку, что есть ** 'неопределенная ссылка на vtable для Menu' **. – Jan

+1

Вам необходимо правильно скомпоновать объект и скомпилировать/связать вывод, который он создает. Вы должны иметь возможность легко находить вопросы/ответы об этом (например, [Q_OBJECT throwing «неопределенная ссылка на ошибку vtable»] (http://stackoverflow.com/questions/4774291/q-object-throwing-undefined-reference-to -vtable-error), [Qt Object Linker Problem «неопределенное уважение к vtable»] (http://stackoverflow.com/questions/2555816/qt-object-linker-problem-undefined-reverence-to-vtable)). –

+0

Удалено файл .user, теперь он работает! Спасибо за это! – Jan