Как подключить QObbject (QPushButton) к методу из другого класса?

В настоящее время я работаю над проектом, который нуждается в соединении между QPushButton класса (окна) Qwidget и методом void из "классического" класса.

Я пытался связать их со всем решением, которое я прочитал, но ни одно не работает правильно.
Либо компилятор возвращает меня

QObject::connect: такого слота нет QWidget::Class::metoh()

или он не будет компилироваться вообще без ошибок.

Вот самый простой код, который я пробовал. Я прочитал документацию по Qt, но это мне не помогло. Я также попытался включить Q_OBJECT Макро но это приводит к ошибкам. Я также читал, что с Qt5 больше нет необходимости определять слоты. Я правильно понял?
Как я могу подключить метод Some_Class к QPushButton?

 // Classical class header //   
#ifndef DEF_CLASS
#define DEF_CLASS

#include <iostream>
#include <cstdlib>
#include <string>


class Some_class
{
    protected: // permet l'acces pour les methodes style soin

    Some attributes;

    public:
    Some_Class(int id);
    //Personnage(int id, int vieAtStart, int degatsArmeAtStart);

    void method();

    // obligation de passer par des references pour avoir une modification effective 

    ~Some_Class();
};

#endif

// Classical class cpp //

#include "Some_Class.h"

#include <QObject>

#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;

    Some_Class::Some_Class(int id)
    {
        Id = id;
        some attributes;
    };

    void Some_Class::method()
    {
        modification of attributes;
    };

// Window class header //

#ifndef DEF_WINDOW
#define DEF_WINDOW

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QIcon>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QImage>
#include <QPixmap>
#include <QLabel>
#include <QGraphicsPixmapItem>
#include "Some_Class.h"


class Window : public QWidget // On hérite de QWidget (IMPORTANT)
{
    public:
    Window(Some_Class test);

    // public slots:
    // void go_right();

    private:

    QPushButton *m_button; 
};

#endif

// Window class cpp //

#include "Window.h"

#include <string>
#include <QObject>

Window::Window(Some_Class test) : QWidget()
{
    setFixedSize(874, 968);

    m_button = new QPushButton("test", this);

    QObject::connect(m_button, SIGNAL(clicked()), this, SLOT(Some_Class::method()));
    //QObject::connect(m_bouton_droite, SIGNAL(clicked()), qApp, Personnage::go_right());
    //QObject::connect(m_bouton_droite, &QPushButton::clicked,qApp, Personnage::go_right());
}

#include <QApplication>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QIcon>
#include "Window.h"
#include "Some_Class.h"
#include <QObject>

// main.cpp //

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Window win(Heros);
    win.show();

    return app.exec();
}

1 ответ

Во-первых, вам понадобится объект Some_Class с соответствующей областью применения. В настоящее время у вас есть только test в вашем конструкторе, который является параметром значения и, таким образом, уничтожается, когда конструктор возвращается. Один из вариантов - передать тест в качестве указателя, если передаваемый объект имеет правильное время жизни.

Window::Window(Some_Class *test)

Если это не подходит в вашем случае, вам нужно будет сохранить копию в вашем Window объект. Для остальной части этого ответа я, однако, предположу, что вы передаете указатель.

С обычным объектом C++ (не QObject) вы не можете использовать макросы SIGNAL/SLOT, потому что они требуют использования маркеров слота / сигнала в определении класса. Я вижу, вы пытались использовать синтаксис указателя на современный метод, но допустили одну ошибку. Третий параметр должен быть адресом объекта типа Some_Class,

QObject::connect(m_button, &QPushButton::clicked, test, &Some_Class::method);

Однако это еще не все, чтобы это работало, сигнатура clicked должна соответствовать методу Some_Class::, которого нет. clicked имеет bool checked параметр. Конструкция с макросами SIGNAL/SLOT позволяет слоту иметь меньше параметров, но эта версия соединения является более строгой и требует строгого соответствия. Вы можете добавить параметр в method или используйте лямбду, если у вас есть C++11.

QObject::connect(m_button, &QPushButton::clicked, [test] (bool) {
         test->method();
     });
Другие вопросы по тегам