Как подключить 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();
});