QTextEdit funziona con .append e non con .settext



  • Buonasera.
    Ho una classe con un campotext = new QTextEdit ed una funzione per inserire dati nel campo.
    Mi succede una cosa strana: se nella funzione per l'aggiornamento scrivo campotext->append("QQQ\n") mi accoda QQQ al campo sul video, mentre se provo a sostituirlo completamente con campotext->settext("AAA\n") mi va in errore in esecuzione col seguente messaggio: QObject: Cannot create children for a parent that is in a different thread.
    Cosa dovrei fare per evitare l'errore ? Grazie.



  • Puoi postare un po' piu' del tuo codice? in particolare, stai usando qualche multithread (QThread, Qt::Concurrent, QRunnable, std::thread, std::async), etc?



  • Hi @bvox123

    Share a sample code,
    This code may help you.

    #include "widget.h"
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        m_VBlyt = new QVBoxLayout(this);
        m_PB1    = new QPushButton("ClicK");
        m_TE1    = new QTextEdit();
        m_TE1->setText("ASDFQWERTY");
        m_TE1->append("ppppppppppp");
        m_VBlyt->addWidget(m_TE1);
        m_VBlyt->addWidget(m_PB1);
        connect(m_PB1,SIGNAL(clicked(bool)),this,SLOT(SLT_AddNewData()));
    }
    
    Widget::~Widget()
    {
    
    }
    
    void Widget::SLT_AddNewData()
    {
        m_TE1->clear();
        m_TE1->setText("poiuytrlkjh");
    }
    


  • Scusate il ritardo.
    Sì VRonin, sto usando (o meglio tentando di usare) QThread. Mi sono riferito in particolare all'esempio che si può generare col Qt Creator, ovvero queuedcustomtype. La mia esigenza era la seguente. Voglio avere un thread che si avvia all'inizio del programma e prosegue sempre in un loop infinito finché non si chiude il programma. All'inizio di questo thread c'è il controllo di uno switch per verificare se deve o meno aggiornare il form a video. Bene, quando porto lo switch in on e quindi il modulo che visualizza una matrice dovrebbe esporre nuovi dati, ho le seguenti istruzioni:

    la dichiarazione è questa:    QTextEdit *qt5TabellaEsposizioni [18];
    
        stringstream arco1;
        switch (combinazione) {
        case 0:
    //        cout << "Questo è progrestratto: " << HRvbl::progrestratto << endl;
            arco1 << HRvbl::progrestratto << "\n";
    //        cout << "Questo è arco1: " << arco1.str() << " " << endl;
            arco1 << arco1.str() << qt5TabellaEsposizioni[combinazione]->toPlainText().toStdString();
            break;
    .....
        arco1 << arco1.str() << qt5TabellaEsposizioni[combinazione]->toPlainText().toStdString();
        QString arco2 = QString::fromStdString(arco1.str());
    //    qt5TabellaEsposizioni[combinazione]->setText(arco2);
        qt5TabellaEsposizioni[combinazione]->setText("QQQ\n");
    //    qt5TabellaEsposizioni[combinazione]->append("QQQ\n");
    

    Ho verificato che se inverto la disattivazione delle ultime due istruzioni mi va in errore. Ho verificato che funziona anche con insertPlainText(arco2) e forse potrebbe andare bene, ma non riesco a capire perché in arco2 ci va a finire "1\n1\n1n\1\n", ma questo è un altro problema che devo cercare di capire.



  • @bvox123 said in QTextEdit funziona con .append e non con .settext:

    qt5TabellaEsposizioni

    Scusa non capisco bene cosa sia "qt5TabellaEsposizioni" una sorta di QSettings dove ti salvi i valori?
    con il cursore di QTextEdit puoi scrivere ovuque senza complicarti la vita con il QTextCursor

    qtexteditXX->textCursor().movePosition(QTextCursor::Left, QTextCursor::MoveAnchor, 4);
    

    http://doc.qt.io/qt-4.8/qtextcursor.html#insertHtml



  • Alcuni sistemi operativi (Widows in testa) non supportano la modifica della GUI da thread "secondari". In Qt questo si traduce in una restrizione che dice che solo il thread in cui vive QApplication puo' modificare la GUI

    Per fare cio' che stai tentando devi emettere un segnale dal secondo thread con i dati necessari e il thread principale poi lo intercetta e aggiorna la GUI



  • Grazie. Era tutto piuttosto ingarbugliato, ho risolto (credo) sostituendo i QTextEdit con dei semplici QLabel.



  • Purtroppo non e' ok comunque. Hai una race condition che prima o poi ti torna a mordere il posteriore


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.