Создание собственных сигналов и слотов

221
20 апреля 2018, 16:00

Программа имеет считывать данные с консоли, используя класс QTextStream, и записывать их в линейный контейнер QStack до введения терминального 12.5±0.2 значение (оно не должно попасть в контейнер). Создать 2 класса, которые должны быть дочерними от QObject. Первый класс: имеет метод, который запускает таймер и сигнал с аргументом типа данных. второй класс имеет слот с аргументом типа данных. Связать сигнал объекта первого класса и слот объекта второго класса. В timerEvent () первого класса генерируется случайное целое число в диапазоне количества элементов в контейнере. найти в контейнере значение по этому индексу и вывести на экран, если значение соответствует специальному значению 1.3±0.8, сгенерировать сигнал с соответствующим аргументом. Слот второго класса должен вывести сообщение о завершении и завершить выполнение программы. Вот я сделал но оно не правильно работает, где что неправильно?

//MySignal.h
#ifndef SIGNALCLASS_H
#define SIGNALCLASS_H
#include <QObject>
#include <QStack>
#include <QDebug>
#include <qmath.h>
class MySignal : public QObject {
    Q_OBJECT
public:
    explicit MySignal(QStack<float> stack);
protected:
    void timerEvent(QTimerEvent *event);
private:
    QStack<float> s;
signals:
    void printSignal(float ch);
public slots:
};
#endif // SIGNALCLASS_H
//MySlot.h
#ifndef SLOTCLASS_H
#define SLOTCLASS_H
#include <QObject>
#include <QDebug>
#include <QCoreApplication>
class MySlot : public QObject {
    Q_OBJECT
public:
    explicit MySlot(QObject *parent = 0);
signals:
public slots:
    void print(float ch);
};
#endif // SLOTCLASS_H
//MySignal.cpp
#include "MySignal.h"
MySignal::MySignal(QStack<float> stack) {
    s = stack;
}
void MySignal::timerEvent(QTimerEvent *event) {
    int n = qrand() % s.count();
    if (qFabs(1.3-s.at(n)) <= 0.8) emit printSignal(s.at(n));
    else qDebug() << s.at(n);
}
//MySlot.cpp
#include "MySlot.h"
MySlot::MySlot(QObject *parent) : QObject(parent) {
}
void MySlot::print(float ch) {
    qDebug() << "Number " << ch << " found. Closing application...";
    QCoreApplication::exit();
}
//main.cpp
#include <QCoreApplication>
#include <QTextStream>
#include <QDebug>
#include <QStack>
#include <qmath.h>
#include <MySignal.h>
#include <MySlot.h>
int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);
    float ch;
    QTextStream in(stdin);
    QStack<float> stack;
    while (true) {
        in >> ch;
        if (qFabs(ch-12.5) <= 0.2) break;
        stack.push_back(ch);
    }
    MySignal *signal = new MySignal(stack);
    MySlot *slot = new MySlot();
    signal->startTimer(100);
    QObject::connect(signal, SIGNAL(printSignal(float)), slot, SLOT(print(float)));
    return app.exec();
}
READ ALSO
Как вынести переменную из класса?

Как вынести переменную из класса?

Имеется следующий код (рисует множество Мандельброта):

263
Подружить cmake и glew в личном проекте

Подружить cmake и glew в личном проекте

Написал небольшую программу на visual studio 15 c++ с использованием GLEW GLFW GLM OpenCVПо требованиям человека, которому я это делаю, я должен отдать проект...

184
Сборка небольшого проекта из GitHub

Сборка небольшого проекта из GitHub

Доброго времени сутокСобираю проект https://github

172