Как подключить QObbject (QPushButton) к методу из другого класса? - PullRequest
0 голосов
/ 20 января 2019

В настоящее время я работаю над проектом, которому требуется соединение между 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 Ответ

0 голосов
/ 20 января 2019

Сначала вам понадобится объект 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();
     });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...