Hilfe mit dem Buttonkrieg

Alles rund um die Programmierung mit Qt
Antworten
yosh-summer
Beiträge: 13
Registriert: 4. Juli 2007 09:00
Wohnort: Wien
Kontaktdaten:

Hilfe mit dem Buttonkrieg

Beitrag von yosh-summer »

Also hi an Alle,

ich habe folgendes Problem:

Ich möchte mein eigens programmierten SLOT mit einem Button und dem SIGNAL => Clicked verbinden. Jeodch habe ich das Problem, dass mein SLOT mehrere Parameter braucht und ich das auf keinen Fall ändern will.

Hier kommt nur leider das Problem mit der Regel von der Connectivität von SLOTS und SIGNALS => "IN EINEM SLOT VERWENDETE METHODE\FUNKTION DARF NICHT MEHR PARAMETER ALS DAS SIGNAL HABEN".

Nun ist ja das Problem, dass das Event CLICKED nur einen boolschen Parameter hat und meine Methode hat weitaus mehr Parameter.

Wie kann ich nun den Button mit dem Signal CLICKED mit meinem SLOT mit meheren Parametern verbinden?????????



Entschuldigt mich bitte wenn diese Frage schon mehrmals gestellt wurde ich konnte aber leider nichts brauchbares bzw. eine Erklärung hierfür in der Suche finden.

Danke an all eure Bemühung schon im Vorhinaus

mfg Yosh
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag von RD1978 »

Hallo,

du hättest die Möglichkeit den Button mit einem Slot zu verbinden der keine Parameter hat, in welchem du deinen Slot mit den vielen Parametern einfach als Methode aufrufst.

MfG RD1978
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

Beitrag von NoobSaibot »

schau dir lieber den QSignalMapper an.
yosh-summer
Beiträge: 13
Registriert: 4. Juli 2007 09:00
Wohnort: Wien
Kontaktdaten:

Beitrag von yosh-summer »

Ja das wäre schön aber du hast leider etwas vergessen.

ICH KANN DANN NICHT MEHR AN DIE METHODE DIE PARAMETER ÜBERGEBEN SONDERN MUSS DIESE IN GLOBALE VARIABLEN SPEICHERN UND DAS WILL ICH NICHT WEIL GLOBALE VARIABLEN UNSCHÖN SIND

auf diese Lösung bin ich leider auch schon gekommen aber diese nützt mir rechtlich wenig leider

danke
May-C
Beiträge: 20
Registriert: 28. März 2007 20:37

Beitrag von May-C »

1. SCHREI NICHT DAS NERVT

2. Warum hilft dir der Tipp von RD1978 nicht weiter? Vielleicht würde es helfen wenn du ein konkretes Beispiel bringen würdest.
yosh-summer
Beiträge: 13
Registriert: 4. Juli 2007 09:00
Wohnort: Wien
Kontaktdaten:

Beitrag von yosh-summer »

OKAY SORRY DASS ICH GESCHRIEHEN HABE xD

der tipp hilft mir deswegen nicht:

Code: Alles auswählen

void functionA(void)
{
     void functionB(char Name, bool ABC,....)
     {}
}
Die Funktion B benötigt diese Parameter. Diese kann man aber leider nur beim Aufruf der Methode übergeben:

Code: Alles auswählen

functionB(A, TRUE,....);
oder ich setzte hierfür globale Variablen auf die die Methode zugreifen kann.

JEdoch ich will keine Globale Variablen.



Wenn ich jetzt die FUNCTIONA calle habe ich leider keine chance der functionB irgendwelche Parameter zu übvergeben.


mfg

Yosh
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Mach dir dein eigenes Signal. Du connectest den Button mit einem Slot ohne Parameter und in dem emittierst Du dein eigenes Signal.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag von RD1978 »

...das ist im Prinzip das selbe, nur umständlicher. :wink:
Beim senden des Signals müssen ja auch die Variablen bzw. Werte an das Signal übergeben werden.

MfG RD1978
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Aber er will es doch unbedingt mit Signalen machen. Dann lass ihn doch.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag von RD1978 »

...wollte den Vorschlag mit dem eigenen Signal auch erst machen aber dachte mir das verwirrt vielmehr als es hilft. :wink:

Kann auch nicht ganz nachvollziehen, warum Variablen oder Objekte die ich in meiner Klasse benötige, keine Member (Eigenschaften) dieser Klasse seinen sollen.

MfG RD1978
yosh-summer
Beiträge: 13
Registriert: 4. Juli 2007 09:00
Wohnort: Wien
Kontaktdaten:

Beitrag von yosh-summer »

Naja und wie soll ich dann eurer Meinung folgende Aufgabestellung am Besten lösen:

Einen Button der auf Knpfdruck verschiedene Texte in einer Textbox ausgibt

Ich habe mir nun gedacht ich schreibe mir einen Slot, der PRINT heißt und wo ich einen Parameter habe der als CHARARRAY dient wo der Text steht. Diesen übergebe ich dann immer Extra bei jeder Connection anweisung.

Was habt ihr für mich für einen Vorschlag wie ich das dann mit Member Variablen machen kann???


danke

mfg Yosh
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

Beitrag von NoobSaibot »

du könntest im SLOT den sender() Abfragen und danach entscheiden welcher Text zu setzen ist.
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag von RD1978 »

Ich nehme an mit Textbox ist ein QTextEdit gemeint...

Code: Alles auswählen

// Button mit Slot verbinden... z.B. im Konstruktor.
QObject::connect( myBtn, SIGNAL(clicked()), this, SLOT(mySlot()) );

// Slot der mit dem Button verbunden ist könnte so aussehen.
mySlot() {
    // m_str ist ein private Member QString, dieser muß dann natürlich noch einen Wert bekommen,
    // ob im Konstruktor oder einer anderen Methode oder hier oder wo auch immer...
    this->myMethod( m_str );
}

// Methode die durch den Slot aufgerufen wird könnte so aussehen.
myMethod( const QString &str ) {
    myTextEdit->setText( str );
}
MfG RD1978
yosh-summer
Beiträge: 13
Registriert: 4. Juli 2007 09:00
Wohnort: Wien
Kontaktdaten:

Beitrag von yosh-summer »

Okay ich danke ersteinmal für die Mühe eurerseits. Jedoch finde ich es schade, dass es unter QT nicht mehr möglich ist, unter Anführungszeichen einer Methode beliebige Parameter zu übergeben. Denn wenn ich meine Vorstellung bezogen auf das Beispiel durchsetzten will kann ich nicht direkt in der Methode den Parameter mitliefern sondern muss immer zufor durch einen Zugriff auf die Variable den Text ändern aber egal.

Kann mir einer vielleicht erklären der genügend Hintergrundwissen besitzt, warum die Connect-Funktion so "bescheuert" gemacht ist, wegen gleichen Parametern und gleicher Anzahl. Ich finde einfach keine Erklärung für mich.

Danke an ALle

mfg Yosh
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag von RD1978 »

naja, was heißt bescheuert?

Erstma müssen die Parameter nicht gleich sein, Signale können auch mehr Parameter haben wie Slots, dann werden die übrigen Parameter halt verworfen, wobei die Parameter aber vom gleichen Datentyp sein müssen, alles andere wäre auch unlogisch.

Bsp.:

Code: Alles auswählen

// Das funktioniert
QObject::connect( obj, SIGNAL( mysig(int, char) ), this, SLOT( myslot(int) ) );

// Das funktioniert nicht
QObject::connect( obj, SIGNAL( mysig(int, char) ), this, SLOT( myslot(char) ) );
Beim Aufruf der connect-Methode übergibst Du ja auch keine Werte sondern nur die Datentypen. Qt wartet dann im Hintergrund auf das Signal, welches beim Aufruf Werte mitgeliefert bekommt und führt halt dann den Slot mit diesen Werten zu diesem Zeitpunkt aus.

Hoffe das halbwegs richtig erklärt zu haben... :wink:

MfG RD1978
Antworten