PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : qtable in einem QMainWindow --> keyevents abfangen



Linuxexplorer
15-02-2003, 13:30
Hi !

Ich habe eine QTable, die in einem QMainWindow plaziert ist. Jetzt möchte ich, dass wenn Control gedrückt wird, eine neue Zeile in der QTabl eingefügt wird. Leider funktioniert mein eventHandler nicht, keine Ahnung warum. Hier mein Code.

Im Hederfile:

void keyPressEvent(QKeyEvent* event);

In der Implementierung:

void QstFileEditor::keyPressEvent(QKeyEvent* event)
{
if((event->key() == Key_Control))
{
if(iEntryRead == tTable->currentRow())
{
insertEntry();
}

}
}

Ich habe schon eine Idee, wie es funktionieren könnte. Aber vielleicht geht's auch anders.
Meine Idee:
Eine neue Klasse (geerbet von QTable) anlegen und dort den Eventhandler neu implementieren.
Dann diese Klasse als Tabelle benützen.

MFG: Linuxexplorer

anda_skoa
15-02-2003, 13:41
Original geschrieben von Linuxexplorer

Im Hederfile:

void keyPressEvent(QKeyEvent* event);

In der Implementierung:

void QstFileEditor::keyPressEvent(QKeyEvent* event)
{
if((event->key() == Key_Control))
{
if(iEntryRead == tTable->currentRow())
{
insertEntry();
}

}
}


Bitte code tags benutzen.



Ich habe schon eine Idee, wie es funktionieren könnte. Aber vielleicht geht's auch anders.
Meine Idee:
Eine neue Klasse (geerbet von QTable) anlegen und dort den Eventhandler neu implementieren.
Dann diese Klasse als Tabelle benützen.


Genau das ist der vorgesehene Weg, um Events zu behandeln.

Ich hätte besser Lektion 5 des Tutorials noch posten sollen :)

Wenn du um keinen Presis ableiten willst, kannst ein anderes QObject als EventFilter am QTable installieren.

Siehe dazu QObject::installEventFilter und QObject::eventFilter

Der Vorteil der Ableitung ist, dass du natürlich auch protected Variablen und Metthoden zugreifen kannst.

Ciao,
_

Linuxexplorer
16-02-2003, 11:11
Hi !

Ok, habe jetzt die neue Klasse erstellt, funktioniert auch wunderbar. Da wäre aber noch was:

Da ich vorher die Funktion zum einfügen der neuen Zeile in der Klasse deklariert habe, in der auch die QTable war, war es kein Problem, auf einen Wert zuzugreifen, den ich in dieser Funktion benötige, dieser Wert enthält die Anzahl der gelesenen Datensätze.
Da jetzt dieser Eventhandler in der geerben Klasse ist, muss ich dort die Funktion zum Einfügen der neuen Zeile aufrufen, nur kann ich doch nicht auf eine Variable zugreifen, die in einem Objekt ist, dass in der gleichen Klasse deklariert ist wie die Variable, oder? Habe auch schon versucht, diesen Wert als Gloabl zu deklarieren, da hatte ich aber das Problem, dass die Variable immer als nicht deklariert gemeldet wurde, da ich mehere Sourcecodefiles verwende:rolleyes:

Ich hoffe ihr könnt meine Gedanken nachvollziehen.


PS: Ich muss diesen Wert auch ändern könen, also von der geerben Klasse aus.

MFG: Linuxexplorer

Linuxexplorer
16-02-2003, 13:54
Hi

Also das mit der globalen Variable habe ich jetzt hinbekommen. Nun plagt mich ein anderes Problem, denn ich habe den Eventhandler von dieser QTable ja neu implementiert, dass heisst, die Tabelle reagiert jetzt nicht mehr auf die Pfeiltasten etc. Dieses Problem war leicht zu lösen, indem ich in der Qt-Source den originallen Eventhandler rauskopiert habe und in meine abgeleitet Klasse eingefügt habe. Jetzt kommt das eigentlich Problem, denn einige Elemente sind als private deklariert worden, und jetzt habe ich natürlich keinen Zugriff auf dieses Elemente. Habe da mal was von "befreundeten Klassen" gehört, würde dass hier funktionieren, wenn ja, wie ?

MFG: Linuxexplorer

anda_skoa
16-02-2003, 14:19
Original geschrieben von Linuxexplorer

Also das mit der globalen Variable habe ich jetzt hinbekommen.


Globale Variablen sollte man vermeiden.

Ich sehe da mehr oder weniger drei Lösungsansätze.

a) Die Variable wird in der QTable Subklasse verwaltet.
D.h. der Initialwert muss irgenwann gesetz werden, zB im Konstruktor.
Dann einfach eine Methode um ihn rauszubekommen und eine, um ihn zu setzen.

b) Man macht das Einfügen nicht in der QTable Subklasse, sondern man benutzt ein eignes Signal, um das Drücken von Control zu melden.
Die externe Klasse verfährt dann wie gehabt.

c) Du hast die set/get Methoden in der äußeren Klasse und übergibts dem Table einen Pointer auf diese Klasse.
Dann kann der Table immer den aktuellen Wert abfragen.



Nun plagt mich ein anderes Problem, denn ich habe den Eventhandler von dieser QTable ja neu implementiert, dass heisst, die Tabelle reagiert jetzt nicht mehr auf die Pfeiltasten etc. Dieses Problem war leicht zu lösen, indem ich in der Qt-Source den originallen Eventhandler rauskopiert habe und in meine abgeleitet Klasse eingefügt habe.


Das ist der falsche Weg.
Würde zB ein Bug in diesem Handler stecken und er würde in der Qt behoben werden, hast du ihn immer noch drinnen.

Du rufts einfach für alle nicht von dir spezielle behandelten Events die Implementation der Basisklasse auf, wie das in C++ so üblich ist


void MyTable::keyPressEvent(QKeyEvent* e)
{
// deinen events behandlen

QTable::keyPressEvent(e); // Aufruf der Implementation von QTable
}



Ciao,
_

Linuxexplorer
16-02-2003, 14:33
Hi anda_skoa!

Vielen Dank, jetzt funktioniert alles prima!


MFG: Linuxexplorer