C ++ Qt Сигналы и слоты

У меня трудности с подключением к слотам, определенным в другом классе. У меня есть 2 класса — вычисления и MainWindow. Предполагается, что MainWindow обрабатывает только часть программы с графическим интерфейсом, а вычисления — вычисления. Я создаю калькулятор.

По сути, я хочу понять, как я могу подключиться к слотам в классе вычислений из класса MainWindow.

0

Решение

Я думаю, вы уже проверили 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);

в зависимости от того, каким путем это должно пойти.

Надеюсь, это поможет.

5

Другие решения

Такие соединения относятся к уровню, на котором доступны как пользовательский интерфейс, так и контроллер (вычислительный объект). Таким образом, либо в теле 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.

0

Это еще одна версия, как использовать, я думаю, может быть проще для начинающих

Вам нужно определить сигнал и слоты в ваших классах.
Добавьте в заголовок вашего класса, например, сигналы для 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)));
0
По вопросам рекламы [email protected]