Ho una struttura ad albero che rappresenta un sistema di dispositivi collegati al PC tramite porta seriale. In un certo senso, questa struttura è stata ispirata dall'esempio del modello ad albero in Qt e penso che questo aiuti a separare la parte logica dal gui. Il mio modello ha un membro nodo radice e può accedere a tutti i nodi sottostanti attraverso il nodo radice. Alcuni nodi dovrebbero fare il loro lavoro automaticamente (cioè inviare comandi alla porta seriale sul timer). Le attività di routine per l'applicazione sono ordinarie:
- Notifica il modello quando lo stato di un nodo è cambiato.
- Notifica il modello quando la struttura dell'albero è stata modificata, un nodo ha aggiunto un nuovo nodo figlio o ha rimosso un nodo.
Ogni nodo ha un puntatore alla radice e può emettere segnali su qualsiasi cambiamento. Quindi il nodo radice è una sorta di interfaccia per l'albero. Ora sono in difficoltà con l'arresto anomalo durante la rimozione di un nodo figlio e la notifica del modello. In realtà ho risolto questo problema, tuttavia penso che sia qualcosa di sbagliato nel design. Quindi voglio chiedere il modo migliore per implementare l'interazione tra la mia struttura dati e il modello.
Alcune domande sono: la struttura dei dati dovrebbe essere in grado di eseguire alcune azioni su se stessa (aggiungere o rimuovere nodi) e solo notificare il modello sulle modifiche, o che dovrebbe essere rigorosamente eseguita dal modello su richiesta appropriata dall'albero?
Uso Qt, segnali e slot, è sbagliato se la mia struttura si basasse sulla meccanica di QAbstractItemModel - utilizza segnali come nodeIsAboutToBeRemoved / nodeRemoved per preparare il modello per le azioni corrispondenti?
Aggiornamento, sulla struttura che sto usando. Non insisto che l'albero sia la migliore o la struttura ideale per i miei scopi. Ci sono due riflessioni sull'albero: rappresenta naturalmente il sistema reale ed è facile usare i modelli e le viste di Qt (sia in pianta che in tabella). Infine, l'idea dell'albero fu accettata dai capi e dai colleghi. Il mio albero ora è a 5 livelli: root - hub (rappresenta la porta seriale) - dispositivo coordinatore - dispositivo terminale - sensore. Successivamente, è possibile inserire un nuovo livello tra il dispositivo coordinatore e il terminale e una classe hub può essere reimplementata per l'utilizzo di qualcos'altro invece della porta seriale o per utilizzare un altro protocollo. Non c'è il multithreading adesso e non è pianificato, ma mi sembra che il multithreading possa essere iniettato relativamente semplice e naturale. Ogni hub controlla le impostazioni di poort seriale. Il nodo ad ogni livello conosce tutti i nodi figlio e quindi sa come formare una serie di comandi per il rilevamento dei dispositivi fisici. Ogni nodo può mantenere il suo stato (è accessibile a livello fisico o meno) e passare questo stato ai bambini o semplicemente controllare il loro comportamento.