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

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

0 голосов
/ 31 августа 2018

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

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

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

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

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

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

Полагаю, вы уже проверили страницу 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);

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

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

...