Изъятие значения QspinBox из сигнала

213
12 июля 2018, 01:40

Накануне делаю простенькое приложение, а именно график на кривые Лиссажу. Почти все сделал, но остаётся маленькая загвоздка.

class LissageFunction : public QObject
{
    Q_OBJECT
public:
    LissageFunction(QObject *obj = 0);
    void setFunction(double wa, double wy, double w1, double w2);
    double getWx();
    double getWy();
    double getW1();
    double getW2();
    void setFunctionInPoints();
    QVector<QPointF> getFunctionInPoints();
private:
    double Wx;
    double Wy;
    double W1;
    double W2;
    QVector<QPointF> function;
public slots:
    void setValueWx(double wx){ this->Wx = wx; emit changeFunction()};//пример
    void setValueWy(double);
    void setValueW1(double);
    void setValueW2(double);
signals:
    void changeFunction();
};

В общем, есть класс на кривые лиссажу, отдельный виджет, который представляет координатную сетку и 4 отдельных QSpinBox-кса для параметров Wx, Wy, W1, W2 - которые как предполагается должны регулировать эти уравнения:

x(t) = sin(Wx * t + W1); y(t) = sin(Wy * t + W2);

Я, допустим регулирую значения и посылаю сигнал

QSpinBox *Wx = new QSpinBox;
connect(Wx,SIGNAL(valueChanged(int)),LissageFunction,SLOT(setValueWx(double)));

(далее в теории я просто высылаю сигнал об изменении значения, и слот из виджета графика перерисовывает из переопределенной функции paintEvent;)

Я не до конца понимаю механизм сигналов и слотов, а из учебника Шлее слишком примитивные или готовые примеры их взаимодействия между виджетами.

Я правильно понимаю, что нужно отдельно наследовать Спинбоксы и определять свои сигналы для моего класса или сигнал valueChanged(int) как-то неявно передает слоту значение? Если да, то как обработать его в сигнале setValueWx(double), чтобы изменить значение переменной

Answer 1

Нашел одно решение, чтобы понять, от какого сигнала спинбокса пришло значение и изъять его значение, можно этой строкой

int x = ((QSpinBox*)sender())->value();

В описываемом слоте.

P.S значения в сигналах передаются слоту явно, поэтому можно обрабатывать прямо из параметра слота без выше написанной функции. А так же, что бы сигнал и слот имел исключительно одинаковый тип, без int -> double, как это было у меня.

READ ALSO
Синхронизация двух потоков

Синхронизация двух потоков

Здравствуйте возник вопрос в синхронизации отдельной части приложения, вот пример:

202
Бинарная запись. С++

Бинарная запись. С++

Объясните, пожалуйста, как производится запись? Есть файл с такими строками:

217
Очередь(Добавление элементов)

Очередь(Добавление элементов)

Нужно создать функцию, добавление элементов в очередь, выводится ошибка:"Выражение должно быть допустимым для изменение левосторонним значением"...

373