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?

- Rejestracja:ponad 13 lat
- Ostatnio:prawie 3 lata
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.

- Rejestracja:około 17 lat
- Ostatnio:4 minuty
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ź.

- Rejestracja:ponad 21 lat
- Ostatnio:minuta
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.
- Rejestracja:ponad 8 lat
- Ostatnio:około 8 lat
- Postów:10
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:
- W pliku
test.h
, klasatest
która dziedziczy potest::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.