Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [QT4] Ermitteln des SIGNAL Handlers/Senders



undefined
01-02-2006, 11:34
Gibt es unter QT4 eine Möglichkeit den SIGNAL Sender zu ermitteln?
Wenn jetzt ui.bin_* editingFinished() Sendet. Kann ich Irgendwie herausfinden welcher der drei Objecte das Signal gesendet hat?



#include <QMessageBox>

#include "qotrdecoder.h"

qotrdecoder::qotrdecoder()
{
ui.setupUi(this);
// connect( ui.btn_cancel, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );
// connect( ui.btn_decode, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );
// connect( ui.btn_open_bin, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );
// connect( ui.btn_open_key, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );
// connect( ui.btn_open_dir, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );
connect( ui.inp_bin, SIGNAL( editingFinished() ), this, SLOT( SlotStringTester() ) );
connect( ui.inp_key_file, SIGNAL( editingFinished() ), this, SLOT( SlotStringTester() ) );
connect( ui.inp_output, SIGNAL( editingFinished() ), this, SLOT( SlotStringTester() ) );
}

void qotrdecoder::SlotTester()
{
QMessageBox::warning( new QWidget(), "SlotTester", QString( "Slot Tester" ) );
}

void qotrdecoder::SlotStringTester()
{
QString in;
// Hier wuerde ich jetzt gerne das Object des Signal Handlers ermitteln
in.append( ui.inp_bin->text() );
QMessageBox::warning( new QWidget(), "SlotStringTester", in );
}

qotrdecoder::~qotrdecoder()
{}

RHBaum
01-02-2006, 11:52
da der die slots und Signale uber Funktionspointer verknotet, solltest da keine chance haben... du kannst die bestehenden Verbindung zwar rausbekommen (damit alle moeglichen Sender), aber nicht den wirklichen Absender.

Ist z.b. in windows in der MsgPump genau so ... wenn ne message da reingestellt wird, iss keine info mehr hinterlegt, wer das gewesen ist.

Wenn du sowas wissen willst, deutet das meist auf ne Designschwaeche in deinem Konzept hin ....
wenn du mehr infos ueber das ausloesen eines events brauchst, sollten die infos auch teil der schnittstelle sein ...

eintweder du machst fuer jedes Object nen eigenen Haendler(slot) im Empfaenger, oder du bohrst dein Signal / Slot auf um Parameter, die dir die Infos liefern ...

Ciao ...

locus vivendi
01-02-2006, 12:27
Gibt es unter QT4 eine Möglichkeit den SIGNAL Sender zu ermitteln?
Ja, QObject::sender mal anschauen.

undefined
01-02-2006, 13:52
@RHBaum
Stimmt schon mit der Designschwäche, ich hatte auch in die falsche Richtung gedacht, ich wollte bei mehrere LineEdits die Eingabe Parsen aber dazu bietet - wie ich jetzt festgestellt habe - Qt ja schon die QRegExpValidator an.
Jedoch habe ich jetzt ein weiteres Problem:
Seltsamerweise nimmt er meinen Regexp beim email (LineEdit) nicht an.
Bei den ersten drei LineEdit's stimmt es, habe ich hier ein Speicherproblem?

qotrdecoder::qotrdecoder()
{
ui.setupUi(this);

QRegExp ireg( "[\\w\\d\\/\\.-]+", Qt::CaseInsensitive );
QRegExpValidator VPath( ireg, this );
ui.inp_bin->setValidator( &VPath );
ui.inp_key_file->setValidator( &VPath );
ui.inp_output->setValidator( &VPath );

QRegExp mreg( "([\\w\\d\\/\\.-]+)@([\\w\\d\\/\\.-]+)\\.([a-z]{2,})", Qt::CaseSensitive, QRegExp::FixedString );
QRegExpValidator VMail( mreg, this );
ui.inp_email->setValidator( &VMail );

// Signals
connect( ui.btn_cancel, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );
connect( ui.btn_decode, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );
connect( ui.btn_open_bin, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );
connect( ui.btn_open_key, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );
connect( ui.btn_open_dir, SIGNAL( clicked() ), this, SLOT( SlotTester() ) );

connect( ui.inp_bin, SIGNAL( textEdited( const QString & ) ),
this, SLOT( SlotStringTester( const QString & ) ) );
connect( ui.inp_key_file, SIGNAL( textEdited( const QString & ) ),
this, SLOT( SlotStringTester( const QString & ) ) );
connect( ui.inp_output, SIGNAL( textEdited( const QString & ) ),
this, SLOT( SlotStringTester( const QString & ) ) );

// connect( ui.inp_pass, SIGNAL(), this, SLOT() );
// connect( ui.inp_email, SIGNAL(), this, SLOT() );

}