У меня трудности с подключением к слотам, определенным в другом классе. У меня есть 2 класса — вычисления и MainWindow. Предполагается, что MainWindow обрабатывает только часть программы с графическим интерфейсом, а вычисления — вычисления. Я создаю калькулятор.
По сути, я хочу понять, как я могу подключиться к слотам в классе вычислений из класса MainWindow.
Я думаю, вы уже проверили Qt Signals & Страница игровых автоматов. Чтобы реализовать то, что вы хотите, вам нужно иметь экземпляр вашего класса в другом.
Так например в вашем MainWindow
класс, вы можете включить Computations
класс и создайте его переменную-член:
#include "computations.h"
class MainWindow : public QMainWindow
{
Q_ObBJECT
public:
//..
private:
Computations *_computation;
};
а затем в конструкторе MainWindow
после инициализации _computation
объект (_computation = new Computations();
) вы делаете соединения следующим образом (работает для Qt5):
QObject::connect(_computation, &Computations::somethingHappened, this, &MainWindow::doSomeGuiStuff);
QObject::connect(this, &MainWindow::guiThingHappened, _computation, &Computations::doSomeComputation);
в зависимости от того, каким путем это должно пойти.
Надеюсь, это поможет.
Такие соединения относятся к уровню, на котором доступны как пользовательский интерфейс, так и контроллер (вычислительный объект). Таким образом, либо в теле main
или в классе, который составляет различные элементы приложения на высоком уровне (такой класс обычно не должен быть производным от QApplication
, хоть).
Это почти всегда слишком тесная связь, если класс пользовательского интерфейса знает о существовании вычислительного объекта или как-то связан с его деталями. Я обычно проектирую пользовательский интерфейс, чтобы иметь интерфейс, состоящий из сигналов и слотов настолько общего характера, насколько это практически возможно, а затем привязываю его к одному или нескольким объектам контроллера через соединения сигнал / слот. Я также использую систему свойств для общего представления свойств, относящихся к пользовательскому интерфейсу, часто используя объекты viewmodel, чтобы связать независимый от пользовательского интерфейса контроллер с конкретным видом пользовательского интерфейса.
В вашем случае я бы предположил, что ни MainWindow
знать о Computations
ни наоборот
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Computations comp;
MainWindow ui;
QObject::connect(&comp, ..., &ui, ...);
/* more connections here */
ui.show();
return app.exec();
}
Для более конкретных примеров см. ответ № 1 или же ответ № 2.
Это еще одна версия, как использовать, я думаю, может быть проще для начинающих
Вам нужно определить сигнал и слоты в ваших классах.
Добавьте в заголовок вашего класса, например, сигналы для MainWindow, слоты для вычислений
public slots:
void something();
signals:
void something_happend();
Затем в любом месте, где вы хотите использовать его, в вашем примере в mainwindow.cpp, вам нужно подключить сигнал и слот. Сделайте это с помощью QObject :: connect:
QObject::connect(who_emit,SIGNAL(what_signal),who_receive,SLOT(what_slot))
Пример:
mainwindow.h
signals:
void something_happend();
computations.h
public slots:
void something_happend();
mainwindow.cpp
Computations *c = new Computations(this);
QObject::connect(this,SIGNAL(something_happend()),c,SLOT(something()));
Если вы хотите передать некоторые аргументы, SIGNAL и SLOT, которые вы хотите подключить, должны иметь одинаковые типы аргументов:
public slots:
void something(int c);
signals:
void something_happend(int c);
QObject::connect(this,SIGNAL(something_happend(int)),c,SLOT(something(int)));