Qt - generowanie sygnału zmiany zmiennej

0

Odczytuję z czujnika pewne dane i chciałbym, żeby po przekroczeniu ustalonej wartości wykonywała się funkcja do momentu aż użytkownik samodzielnie jej nie przerwie np. naciskając klawisz. Czy można zrobić to w inny sposób niż tworzenie osobnej klasy, która dziedziczy po QObject i nie używać sygnałów i slotów?

1

A nie możesz po prostu po każdym odczycie dać:

if (wartość_odczytu>max)
    funkcja();
0

To zależy jak odczytujesz wartości czujnika.

Jeśli masz interfejs który pozwala Ci na wykrycie zmiany poziomu i wywołanie określonej funkcji - to pewnie nie.

Jeśli masz interfejs synchroniczny i sam sprawdzasz poziom to powinieneś użyć wątków a w drugiej kolejności slotów ew. możesz na timerze sprawdzać wartość flagi którą ten wątek ustawia. Flagę deklarujesz jako std::atomic<bool> i ustawiasz tylko raz - po przekroczeniu poziomu ew. dodajesz funkcję reset która ją zeruje.

0
kacyk napisał(a):

Czy można zrobić to w inny sposób niż tworzenie osobnej klasy, która dziedziczy po QObject i nie używać sygnałów i slotów?

Oczywiście, że można, tylko po co sobie utrudniać życie?
Niestety pytanie jest zbyt ogólnikowe, by dać sensowną odpowiedź.

0
kacyk napisał(a):

Czy można zrobić to w inny sposób niż tworzenie osobnej klasy, która dziedziczy po QObject

Dlaczego osobnej?

i nie używać sygnałów i slotów?

Można to zrobić na wiele różnych sposobów.

0

Faktycznie, powinienem lepiej opisać problem. Nie chcę wrzucać całego kodu bo to bez sensu, piszę w Qt od kilku dni dlatego działam trochę na ślepo więc opisze mniej więcej jak to wygląda:

  1. W pliku test.h, klasa test która dziedziczy po test::QMainWindow tworzę między innymi takie zmienne oraz metody:
private:
        bool autorun_flag;
        QLabel *label;
        void send_dt(int val); //
protected:
        void paintEvent(QPaintEvent * e);
       	void keyPressEvent(QKeyEvent * e);
        void keyReleaseEvent(QKeyEvent * e);
private slots:
        void read_dt();

2 W pliku test.cpp w konstruktorze inicjalizuję zmienne oraz dodaję definicje metod.

        autorun_flag = false;
        connect(udp_read, SIGNAL(readyRead()), this, SLOT(read_dt()));
void test::read_dt()
{
		datagram = udp_read->receiveDatagram();
        data_read = datagram.data();
        obstacle_value = data_read.toInt();
        
        if(autorun_flag == true)
        send_dt(obstacle_value)

		data_read_str.append(data_read);

		label->setText(data_read_str);
		data_read_str.clear();
}

 void test::send_dt(int val)
{
  //
}

No i chcę zrobić w ten sposób, że jeśli autorun_flag == true to w zależności od tego jaką wartość mam pobraną z czujnika obstacle_value chcę wysyłać inne dane z powrotem do źródła.

Rozwiązanie okazało się żenująco proste. Zamiast zdarzenia wystarczyła zwykła funkcja send_dt() w read_dt() :) Ale wklejam ten post, może jest tu coś głupiego czego nie jestem świadomy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1