Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » KDevelop / Qt / wxWidget » textChanged() und QTextEdit

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.02.2007, 10:25 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hi,

ich hab irgendwie ein Problem auf textChanged() aus QTextEdit zu reagieren und weiß nicht so genau wieso ....

C++:
#include "Console.hpp"

Console::Console(QWidget *parent)
  : QWidget(parent)
{
  this->layout = new QVBoxLayout();
  this->edit = new QTextEdit();
  this->setWindowTitle("WShell");
  layout->addWidget(this->edit);
  this->layout->setMargin(0);
  this->edit->setStyleSheet("QTextEdit { background-color: black; color: white; font-weight: bold; }");
  this->resize(600, 400);
  this->setLayout(layout);
  //Darum geht es
  connect(this->edit, SIGNAL(textChanged()), this, SLOT(this->edit->textChanged()));
}

Console::~Console()
{
  delete layout;
  delete edit;
}

void Console::textChanged()
{
  this->edit->setPlainText("Fooo");
}

Ich hab schon alles mögliche versucht, den SLOT anderst zu benennen, ohn mit Console::textChanged() aufzurufen, nur textChanged() und was weiß ich noch alles ...
Der Text ändert sich aber nicht. Jemand ne Idee?

EDIT: Ich nutze QT4.2.2 unter Windows
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 01.03.2007 um 12:01 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.02.2007, 16:10 Uhr
stephanw
localhorst


Dein Quelltext sieht etwas komisch aus.

Console ist also ein Widget und hat ein QTextField. Und wer soll da nun auf wen reagieren ? Willst Du in Console den Text in dem Feld setzen oder auf dessen Änderung reagieren ?

Und schau Dir mal die Dokumentation von QObject::connect() an. Das was Du da macht ist Quatsch
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.02.2007, 17:16 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Was ich machen will ist einfach zu checken, ob sich der Inhalt on QTextEdit (edit in meinem Fall) geändert hat und dann eine Aktion ausführen. Das Einfügen des Textes in dem Fall war nur ein Beispiel, um zu verdeutlichen, das es nicht geht ...

Ich kann dir nicht ganz folgen, wieso mein connect blödsinn sein soll ...

C++:
connect(this->edit, SIGNAL(textChanged()), this, SLOT(textChanged()));

this->edit ist das Widget, welches das Signal sendet (QTextEdit)
SIGNAL(textChanged()) ist das Signal, das vom Widget gesendet wird
this ist das Objekt, das betroffen ist
SLOT(textChanged()) ist die Methode die ausgeführt wird

Was meinst du damit, das mein Quelltext komisch aussieht? Nur, weil ich *this so oft verwendet hab?
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 28.02.2007 um 17:30 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.02.2007, 18:51 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hmm, ok. Ich weiß jetzt, was du meinst

Meine Console.hpp:

C++:
#include <QApplication>
#include <QWidget>
#include <QObject>
#include <QVBoxLayout>
#include <QTextEdit>

class Console
  : public QWidget
{
  Q_OBJECT
private:
  QVBoxLayout* layout;
  QTextEdit* edit;
public:
  Console(QWidget *parent = 0);
  virtual ~Console();
public slots:
  void textChanged();
};

Mit Q_OBJECT drin, schmeißt der mir aber en Linker Error:

Code:
release\Console.o(.text+0x72):Console.cpp: undefined reference to `vtable for Console'
release\Console.o(.text+0x79):Console.cpp: undefined reference to `vtable for Console'
release\Console.o(.text+0x3a2):Console.cpp: undefined reference to `vtable for Console'
release\Console.o(.text+0x3a9):Console.cpp: undefined reference to `vtable for Console'
release\Console.o(.text+0x6a6):Console.cpp: undefined reference to `vtable for Console'
release\Console.o(.text+0x6ad):Console.cpp: more undefined references to `vtable for Console' follow
collect2: ld returned 1 exit status

Ich hab danach schon gegooglet und gefunden, das man das erst durch den MOC jagen muss. Aber sollte qmake nicht dafür irgendwie sorgen?

EDIT: ich hab einiges dazu gefunden, unter anderem das hier. Allerdings hilft mir das nicht weiter - ich verwende nämlich qmake ...

EDIT die 2te: Ein erneutes erzeugen des pro files mit qmake -project lässt mich zumindest mal kompilieren ... Mal sehen, wie weit ich komme
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 28.02.2007 um 20:29 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.02.2007, 21:20 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Jetzt passiert zumindest mal was. Nur beendet sich das Programm nun bei textChanged() - das war so nicht ganz gedacht

C++:
#include <QApplication>
#include <QWidget>
#include <QObject>
#include <QVBoxLayout>
#include <QTextEdit>

class Console
  : public QWidget
{
  Q_OBJECT
private:
  QVBoxLayout* layout;
  QTextEdit* edit;
public:
  Console(QWidget *parent = 0);
  virtual ~Console();
public slots:
  void textChanged()
  {
    this->edit->setPlainText("Foooooooooo");
  }

};

Und die cpp dazu:

C++:
#include "Console.hpp"

Console::Console(QWidget *parent)
  : QWidget(parent)
{
  this->layout = new QVBoxLayout();
  this->edit = new QTextEdit();
  this->setWindowTitle("WShell");
  layout->addWidget(this->edit);
  this->layout->setMargin(0);
  this->edit->setStyleSheet("QTextEdit { background-color: black; color: white; font-weight: bold; }");
  this->resize(600, 400);
  this->setLayout(layout);
  QObject::connect(this->edit, SIGNAL(textChanged()), this, SLOT(textChanged()));
}

Console::~Console()
{
  delete layout;
  delete edit;
}


Code:
>cmd /c release\foo.exe
>Exit code: -1073741819

--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.03.2007, 09:55 Uhr
stephanw
localhorst


Also: Dein Quelltext sieht komisch aus wegen dem fehlerhaften connect, weil Du in Console einen SLOT "textChanged" hast, der genau so heißt wie das SIGNAL, mit dem es verbunden ist und weil in Console::textChanged() wieder das Feld geändert wird.

Übrigens ist das connect in Deinem Beitrag 002 ein anderes (sinnvolleres) als das in Deiner Frage

Der Header war ja gar nicht zu sehen. Klar, wenn Du SLOTS neu definierst, musst Du moc benutzen. Dafür dann auch Q_OBJECT. Natürlich muss die moc-Ausgabe irgendwie mit übersetzt werden. Am einfachsten mit einem "#include moc_Console.cpp" in Console.cpp".

Wenn jetzt die Verbindung SIGNAL->SLOT klappt, aber Dein Programm abstürzt, dann evtl. wegen einer Endlos-Rekursion !? In Console::textChanged() änderst Du ja den Wert des Textfelds, was wiederum das SIGNAL auslöst.

Vielleicht solltest Du die Benennung ändern:
Console::textChanged() -> Console::slotTextChanged()
Sonst krieg ich einen Knoten im Kopf
--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 01.03.2007 um 09:56 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.03.2007, 10:58 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hmm, stimmt, du hattest recht. Dadurch, das ich den Text änder, und das wiederrum textChanged() aufruft hängt er sich wohl irgendwo auf.

Was ich einfach machen will, ist auf <enter> zu reagieren und je nach eingegebenem unterschiedlichen Text in mein QTextEdit schreiben. Das ist eben das Problem ... kann ich irgendwie verhindern, das textChanged() bei einem "Programmgesteuerten" eintrag gesendet wird?

Auch, wenn ich versuche auf void Console::keyPressEvent(QKeyEvent* event); zuzugreifen, passiert nicht das gewünschte. Der Inhalt wird nur ausgeführt, wenn ich Strg drücke o_O
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 01.03.2007 um 12:02 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.03.2007, 13:53 Uhr
stephanw
localhorst


Du könntest in Console::textChanged() vor dem erneuten Setzten des Textes im Textfeld die Signal/Slot-Verbindung aufheben und danach wieder aufbauen. Oder die Rekursion mit einem Zähler als Member an Console verhinden.
Ob es eine elegantere Möglichkeit gibt (also das Setzten des Textes ohne Rekursion), weiß ich leider nicht.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ KDevelop / Qt / wxWidget ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: