Qt - Sync zwischen zwei QTextEdit

pYroman1ac

Grünschnabel
Hallo liebe Community!

Ich bin noch ein Frischling was das Qt-SDK betrifft und stehe vor einen kleinem Problem. Es geht um die Synchronisation mittels Signal and Slot zwischen zwei QTextEdits.

Ich habe zwei Fenster (sind auch zwei Klassen). Das was in dem einem Fenster passiert soll auch im anderen Fenster passieren.

Slider, DateTimeEdit, LineEdit is ohne Probleme gegangen. Nur das QTextEdit will nicht.

Ich hab schon alles mögliche wie z.Bsp.

Code:
QObject::connect(w.getTextField(), SIGNAL(textChanged(QString)), x.getTextField(), SLOT(setText(QString)));

probiert, aber nichts will funktionieren. Kann mich bitte jemand über die Eigenheiten von diesem bockigen Textfeld aufklären? :)

Vielen Dank schon mal im Vorraus für Eure Hilfe.
Daniel
 
Möchtest du das wirklich mit connect() machen? Benutzt auch den Qt Creator oder nur die libs?
Wie sieht der Code aus?

Hast du es schon mal mit QString s = ui->TextEdit->text(); versucht?

cwriter
 
Hi.

Soweit ich das sehe gibt es kein textChanged(QString) Signal bei QTextEdit. Hast du das evtl. mit QLineEdit verwechselt?

Erhältst du denn keine Warnung auf der Konsole?

Gruß
 
Hallo pYroman1ac,

das textChanged()-Signal bei QTextEdit hat keinen Parameter. Du kannst also auf diese Weise nicht den geänderten Text übergeben. sondern musst ihn nach Auslösen des Events noch explizit mit der text()-Methode vom jeweils anderen Textfeld abholen.

Gruß
MCoder
 
Hallöchen nochmal!

Vielen Dank für eure Antworten! Ich habe mir jetzt eine eigene Klasse mit eigenen Slots geschrieben. Ich möchte euch meine Lösung natürlich nicht vorenthalten! Konstruktive Kritik ist natürlich gerne gesehen!

TextSynchronizer.h
Code:
#ifndef TEXTSYNCHRONIZER_H
#define TEXTSYNCHRONIZER_H

#include <QObject>
#include <QTextEdit>

class TextSynchronizer : public QObject
{
    Q_OBJECT
    QTextEdit *mainwindow, *secondwindow;

public:
    explicit TextSynchronizer(QObject *parent = 0, QTextEdit *mainwindow = 0, QTextEdit *secondwindow = 0);

public slots:
    void fromAtoB();
    void fromBtoA();
};

#endif // TEXTSYNCHRONIZER_H

TextSynchronizer.cpp:

Code:
#include "textsynchronizer.h"
#include <cassert>

TextSynchronizer::TextSynchronizer(QObject *parent, QTextEdit *mainwindow, QTextEdit *secondwindow ) :
    QObject(parent), mainwindow(mainwindow), secondwindow(secondwindow)
{
    assert(mainwindow != 0);
    assert(secondwindow != 0);

    connect(mainwindow, SIGNAL(textChanged()), this, SLOT(fromAtoB()));
    connect(secondwindow, SIGNAL(textChanged()), this, SLOT(fromBtoA()));
}

void TextSynchronizer::fromAtoB()
{
    secondwindow->blockSignals(true);
    secondwindow->setPlainText(mainwindow->toPlainText());
    secondwindow->blockSignals(false);
}

void TextSynchronizer::fromBtoA()
{
    mainwindow->blockSignals(true);
    mainwindow->setPlainText(secondwindow->toPlainText());
    mainwindow->blockSignals(false);
}

Aufruf in der main:

Code:
    QApplication a(argc, argv);
    MainWindow w;
    SecondWindow x;

    QTextEdit *text1 = w.getTextField();
    QTextEdit *text2 = x.getTextField();
    TextSynchronizer tsync(&a, text1, text2);
    QObject::connect(w.getTextField(), SIGNAL(textChanged()), &tsync, SLOT(fromAtoB()));

Vielleicht kann das ja jemand mal brauchen :)

Lg
Daniel
 
Zurück