2010-04-07 11 views
7

Ho una classe come questo
come posso ereditare da QWidget e QThread?

class GUI : public QWidget, public QThread 

Quando faccio quanto sopra ottengo errori circa i segnali di connessione. The error says Reference to "connect" is ambiguous. C'è un modo per ereditare da entrambi?

Grazie

+5

Spiega perché vuoi farlo. Dal momento che non può essere fatto (vedi le risposte) vorremmo sapere quali delle cose che * * funzionerà per suggerirti. Ciò richiede più informazioni. –

+0

il mio programma riceve messaggi da un altro computer tramite firewire. I messaggi ricevuti vengono indirizzati a un file da cui la GUI li legge. Voglio gestire i messaggi firewire in un thread e la GUI in un altro thread. – infinitloop

risposta

11

Non è possibile. Entrambi QWidget e QThread ereditano (non virtualmente) da QObject. Pertanto non hai una derivazione virtuale, quindi due copie di QObject, che confondono il compilatore. QObject è stato specificamente progettato in questo modo. Vedere:

Ci sono alcuni che presumibilmente è andato intorno a questo (non riesce a trovare il link in questo momento, ma è là fuori su Google, ho avuto lo stesso problema due settimane fa), ma nel migliore dei casi è pericoloso.

Modifica: il modo migliore sarebbe probabilmente avere un altro oggetto ereditato da QThread e mantenere quell'oggetto come membro nella classe GUI. Questo è il tipo di soluzione alternativa che la maggior parte delle persone fa in questa materia.

-1

Non è possibile ereditare da più QObjects.

È possibile ereditare da uno e rendere l'altro una variabile membro e lavorare da lì.

class GUI : public QWidget 
{ 
    QThread myThread; 
}; 

Hai chiamato la tua GUI di classe - questa è la GUI principale del tuo programma? Vedere gli esempi nella cartella degli esempi di Qt - hanno programmi di esempio su entrambi GUI's e Threads.

+2

Solo il thread principale può operare sui widget, quindi rendere un widget un membro di un thread sembra strano. Cosa potrebbe portare a compimento? –

+0

oops, non lo sapevo. – Will

+3

"dovresti ereditare da QMainWindow" è falso, dovresti farlo solo se vuoi effettivamente alcune delle funzionalità fornite da QMainWindow. Qualsiasi QWidget senza genitore è automaticamente una finestra. – rohanpm

0

QWidgets e gli oggetti relativi alla GUI non devono trovarsi in thread diversi rispetto al thread principale dell'applicazione. Non dovresti ereditarli entrambi. Non è inoltre possibile chiamare la funzione moveToThread() di un widget.