QLineEdit + Signals

Alles rund um die Programmierung mit Qt
Antworten
Lykurg
Beiträge: 30
Registriert: 9. August 2004 17:30

QLineEdit + Signals

Beitrag von Lykurg »

Hallo zusammen!

QLineEdit hat ja leider nur die Signale:
void textChanged ( const QString & )
void returnPressed ()
void lostFocus ()
void selectionChanged ().
Das ist dumm, denn ich brauch, dass mein "QlineEdit" ein Signal auswirft, wenn es aktiviert wird, sprich, wenn reingeklickt wird, um dadrin was zu schreiben. selectionChanged () tut das leider nicht.
Wie kann ich mir sowas basteln?

Danke,
Lykurg
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

da QLineEdit (wenn auch über 2 Ecken) von QWidget abgeleitet ist, kannst Du Dich der FocusEvents bedienen. Ich hab hier mal ein kleines Beispielprogramm geschrieben, das dürfte Dir weiterhelfen.

Code: Alles auswählen

/****** Datei MySlots.h (Der Name hat nichts zu bedeuten) *******/
#include <iostream>
#include <qlineedit.h>
#include <qhbox.h>


class MyLineEdit : public QLineEdit {

  Q_OBJECT
  
  public:
    MyLineEdit ( QWidget * parent, const char * name = 0 ) : QLineEdit(parent, name) {
     
    }
    
    /*Auf FocusInEvent reagieren*/
    void focusInEvent ( QFocusEvent * e ) {
      printf("%s hat Focus erhalten\n", name());
    }

};

/*Ein Fenster, damit man auch sieht, dass es funktioniert*/
class MyWindow : public QHBox {
  Q_OBJECT
  
  public: 
    MyWindow( QWidget * parent, const char * name = 0 ) : QHBox(parent, name) {
      MyLineEdit *e1 = new MyLineEdit(this, "MyLineEdit1");
      MyLineEdit *e2 = new MyLineEdit(this, "MyLineEdit2");

    }
};


/****** Datei MySlots.h Ende ******/




/****** Datei main.cpp *******/

#include <qapplication.h>

#include "MySlots.h"

using namespace std;

int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    MyWindow *myWindow = new MyWindow(0, "MyWindow");
    
    
    a.setMainWidget(myWindow);
    myWindow->show();
    return a.exec();
}

/****** Datei main.cpp Ende ******/


Gruß

Mike
Lykurg
Beiträge: 30
Registriert: 9. August 2004 17:30

Beitrag von Lykurg »

Hmm, Danke!
Die Lösung ist nur dumm, wenn ich die GUI mit dem Designer erstelle.

Lykurg
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hm, ne dann weiß ich auch nichts, weil da sind die nötigen Signals ja offensichtlich nicht vorhanden. Aber im Grunde ist ja

Code: Alles auswählen

    void focusInEvent ( QFocusEvent * e ) { 
      printf("%s hat Focus erhalten\n", name()); 
    } 
das einzige, was Du nachträglich hinzufügen müsstest.

Gruß

Mike
Lykurg
Beiträge: 30
Registriert: 9. August 2004 17:30

Beitrag von Lykurg »

Sorry, aber wo müsste ich den code einbauen?

Jetzt mal konkret g_neueSprache.h:

Code: Alles auswählen

#include <ui_neueSprache.h>

class g_neueSprache : public ui_neueSprache
{
    Q_OBJECT
   [...]
   private slots:
      void slot_voknameActive();
}
ui_neueSprache ist eine mit dem Designer erstellte Klasse, in der sich ein QLineEdit namens 'vokname' befindet. Nun soll, wenn der user dort reinclickt (sie aktiviert) der slot 'slot_voknameActive()' ausgeführt werden.
Und wo muss ich dienen Code jetzt hinbasteln?

Danke!

Lykurg
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

also was Du machen musst ist die Methode focusInEvent von QLineEdit überschreiben. Das geht soweit ich weiß nur, indem Du eine neue Klasse erstellst, die von QLineEdit abgeleitet ist. D.h. Du müsstest in Deiner ui_neueSprache kein QLineEdit einbinden, sondern die neue Klasse verwenden, die von QLineEdit abgeleitet wurde.

In dieser Form:

Code: Alles auswählen

class MyLineEdit : public QLineEdit { 
 
  Q_OBJECT 
  
  public: 
    MyLineEdit ( QWidget * parent, const char * name = 0 ) : QLineEdit(parent, name) { 
      
    } 
    
    /*Auf FocusInEvent reagieren*/ 
    void focusInEvent ( QFocusEvent * e ) { 
      printf("%s hat Focus erhalten\n", name()); 
    } 
 
}; 
Für die Methode focusInEvent benötigst Du auch keinen Slot, sondern kannst einfach direkt Methoden aufrufen. Da die Methode, die Du aufrufen möchtest in einer anderen Klasse ist, wäre es hier sinnvoll selbst ein Signal zu erstellen, d.h. Du baust sowas in der Art: (jetzt nicht getestet)

Code: Alles auswählen

class MyLineEdit : public QLineEdit { 
 
  Q_OBJECT 
  
  public: 
    MyLineEdit ( QWidget * parent, const char * name = 0 ) : QLineEdit(parent, name) { 
      
    } 
    
    /*Auf FocusInEvent reagieren*/ 
    void focusInEvent ( QFocusEvent * e ) { 
      emit gotFocus();
    } 
 
  signals:
    void gotFocus();
}; 
Wie gesagt, das ist nun nicht getestet, so in etwa sollte das irgendwie laufen. Du hast damit erreicht, dass bei einem focusInEvent das Signal gotFocus() aufgerufen wird. Nun solltest Du in Deiner anderen Klasse in gewohnterweise mittels connect das Signal von MyLineEdit mit dem Slot slot_voknameActive(); aus g_neueSprache verknüpfen können.

Gruß

Mike
pm_Snake
Beiträge: 86
Registriert: 7. September 2004 11:33

Beitrag von pm_Snake »

Am besten wäre du kommst vom Designer weg. Ist überhaupt nicht empfehlenswert. Vieleicht so lange du nur eine kleine Form hast die keine grossartigen Sachen können soll.

Nachträglich Änderungen an Files des Designers machen ist auch nicht ohne. Den Slot wirst du so in die Klasse nicht reinbringen weil dir der Designer die Files immer wieder überschreibt.

Also am besten ansehen wie so ne Klasse geschrieben ist, dich kurz mit Layout unter QT auseinandersetzen und alles funktioniert :)
Antworten