QLineEdit + Signals
QLineEdit + Signals
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
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
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.
Gruß
Mike
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
Hm, ne dann weiß ich auch nichts, weil da sind die nötigen Signals ja offensichtlich nicht vorhanden. Aber im Grunde ist ja
das einzige, was Du nachträglich hinzufügen müsstest.
Gruß
Mike
Code: Alles auswählen
void focusInEvent ( QFocusEvent * e ) {
printf("%s hat Focus erhalten\n", name());
}
Gruß
Mike
Sorry, aber wo müsste ich den code einbauen?
Jetzt mal konkret g_neueSprache.h:
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
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();
}
Und wo muss ich dienen Code jetzt hinbasteln?
Danke!
Lykurg
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:
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)
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
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());
}
};
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();
};
Gruß
Mike
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
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