Domanda

Ho due processi che exange messaggi a vicenda. Processo A è un normale (cioè non-qt) programma, che invia messaggi da elaborare B. Processo B è un'applicazione che mostra QT GUI i messaggi ricevuti in una casella di testo.

Ho creato un widget personalizzato (chiamato ShowMessages) che eredita da QPlainTextEdit e legge i messaggi da un tubo allo scadere di un timer, e li aggiunge nella casella di testo. Codice non è realmente progettato come questo (che sarebbe piuttosto male progettazione credo), ma è solo per rendere le cose semplici qui. Per ragioni che non lo dirà, processo A non può essere arrestato, mentre io sto creando il modulo utilizzando qt-designer.

Il problema è che, mentre sto usando progettista qt (selezionando così i ShowMessages widget e metterlo all'interno della finestra) il widget comincia a mostrare i messaggi, anche se sono nella finestra di progettazione. Questa funzione è fresco, ma il problema è che quando salvo la forma, già presenti i messaggi vengono salvati in file di .ui, che si traduce a sua volta in cattivo comportamento quando inizio il processo B (perché il processo inizia a mostrare i messaggi che ho ricevuto durante la fase di creazione) .

ho potuto pulire la casella di testo appena dopo il processo di B inizia, ma penso che evitare i messaggi di essere presente nel file .ui è molto meglio. Quello che voglio è essere in grado di scrivere codice come questo per il widget:

if <I'm not in the designer>
    timer = QtCore.QTimer(self)
    QtCore.QObject.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("on_timer()"));
    timer.start(2000)

C'è una funzione qt per sapere se sono nella finestra di progettazione? Pensi che la distinzione tra il progettista e il codice runtime è "cattivo"?

(Ci scusiamo per gli errori, ma l'inglese non è la mia lingua principale)

È stato utile?

Soluzione

Forse il tuo widget deve avere una bandiera per se è "attivo" e di default su False così mentre siete nella finestra di progettazione, che non fa nulla. Nel codice si dovrebbe impostare su attivo quando si desidera visualizzare i messaggi. Poi hai anche la possibilità di disattivarla in altri scenari pure.

Ma devo dire, suona come si sta mettendo il codice "controllore" in un widget "vista" che può e probabilmente significare guai per voi lungo la strada (compreso il problema Qt Designer corrente che stai avendo ora ).

Potreste leggere sul design pattern MVC (Model-View-Controller), se non l'hai già.

Aggiornamento:

Per essere onesti, la tua domanda ha chiesto come rilevare se siete in Designer:)

http: // doc .trolltech.com / 4,3 / designer-creazione-custom-widgets.html # creando ben educati-widget

  

Per dare personalizzato widget speciale   comportamento in Qt Designer, fornire una   attuazione del initialize ()   funzione per configurare il widget   processo di costruzione per Qt Designer   comportamento specifico. Questa funzione   essere chiamato per la prima volta prima   eventuali chiamate a createWidget () e potrebbe   forse impostato un flag interno che può   essere testato più tardi, quando le chiamate Designer Qt   la funzione del plugin createWidget ().

Secondo il documento, è fondamentalmente possibile impostare il vostro "inDesignerFlag" true nella funzione di inizializzazione () del tuo widget. Poi rilevare che la bandiera dove richiesto nel codice del widget.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top