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

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

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

4 ответа

Я полагаю, вы уже проверили страницу Qt Signals & Slots. Чтобы реализовать то, что вы хотите, вам нужно иметь экземпляр вашего класса в другом.

Так например в вашем 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);

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

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

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

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

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

вам нужны слоты и сигналы, потому что они работают вместе, например: ваш file.h

      public slots:
    void start();

signals:
    void levelChanged(int level);

реализация:

      void MainBoard::start()
{
    isStarted = true;
    clearBoard();
    emit levelChanged(1);

}

теперь вам нужно связать кнопку

      startButton = new QPushButton(tr("&Start"));
startButton->setFocusPolicy(Qt::NoFocus);

connect(startButton, &QPushButton::clicked, board, &MainBoard::start);
Другие вопросы по тегам