Verständnisproblem beim Ableiten von Klassen am Bsp.: QPushB

Alles zu Entwicklungsumgebungen und Editoren für Qt
Antworten
bierber
Beiträge: 72
Registriert: 27. November 2006 14:12

Verständnisproblem beim Ableiten von Klassen am Bsp.: QPushB

Beitrag von bierber »

Hallo,

ich bin gerade dabei mich tiefer in das QT Thema einzugraben. Hab auch etwas Literatur und einige Tutorials und so gelesen. In allem was ich gelesen habe steht drin, dass man dann auf die Funktionen der Klasse von der Man Abgeleitet hat zugreifen kann.

Am Beispiel eines QPushButton hab ich das mal probiert und folgende Header Datei angelegt.

Code: Alles auswählen

#ifndef QT_TEST_BUTTON_H
#define QT_TEST_BUTTON_H
#include <QWidget>
#include <QPushbutton>


class QT_TEST_BUTTON : public QPushButton
{
	Q_OBJECT
public:
	QT_TEST_BUTTON();
	~QT_TEST_BUTTON();

	void setPressed222();
	bool isPressed222;
private:
	QPushButton btnTest;
};

#endif // QT_TEST_BUTTON_H
Wenn ich die Header Datei nun in ein anderes Projekt einbinde und mir einen von meinen speziellen Buttons erzeugen lassen will, wird mir nur das angezeigt was ich selber hinzugegüfgt habe.

Also setPressed222() und isPressed222.

Was mach ich hier falsch, das ich zusätzlich auf die von QPushButton bekannten Funktionen und parameter zugreifen kann?



Hoffe es ist einigermassen klar was ich will und wo das Problem liegt.

Danke im voraus

Felix
bierber
Beiträge: 72
Registriert: 27. November 2006 14:12

Beitrag von bierber »

Hallo,

die weitere Untersuchung haben ergeben, das es wohl funktioniert (man also die fuktionen des PushButtons ansprechen kann)mir die IntelliSense diese aber nicht anzeigt! kann man das irgendwie erzwingen oder muß ich das durch irgendwelche Tags noch erweitern??

MfG

Felix
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du leitest von QPushButton ab und hast eine Member-Variable vom Typ QPushButton.
bierber
Beiträge: 72
Registriert: 27. November 2006 14:12

Beitrag von bierber »

Hallo,

ok, was genau bedeutet das? Und wie bekomme ich das dann in die IntelliSense von VS08?

MFG

Felix
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

bierber hat geschrieben:ok, was genau bedeutet das?
Dass du Unsinn treibst :D Es macht wenig Sinn, von QPushButton zu erben und gleichzeitig einen Member der gleichen Klasse zu speichern. Bei Bäumen macht das Sinn, dass ein Node einen Zeiger auf parent und child(ren) speichert. (Gibt sicher auch noch andere Konstrukte)
Google mal nach Kombinationen aus "OOP Aggregation Komosition Ableiten Polymorphie". Oder frag dein Buch.
Und wie bekomme ich das dann in die IntelliSense von VS08?
Kann man schwer sagen, weil du uns deine Konfiguration (Qt-Einbindung, etc) vorenthältst.

BTW. hat dies wenig mit "QT Programmierung" zu tun. Entweder "C++ Grundlagen" oder "Entwicklungsumgebungen".
Ich schieb dich mal nach "Entwicklungsumgebungen" mit ganz dickem Bitte lies dir erst ordentliche C++-Grundlagen (samt OOP) an, bevor du mit Qt weitermachst.
bierber
Beiträge: 72
Registriert: 27. November 2006 14:12

Beitrag von bierber »

Hallo,

Entwicklungsumgebung passt ganz gut. Hab das auch nur in QT-Programmierung gepostet weil ich, wie im ersten Thread beschrieben, davon ausgegangen bin, das es sich um ein Programmierfehler handelt und nicht um ein IDE Problem.

Zu meiner konfiguration

Habe Visual Studio 2008 Prof

Dazu die QT 4.7 und das QT Addin 1.1.7


Zu deiner Feststellung:

Was genau meinst du mit Unsinn?

Was ich vor hatte war die funktionalität des QPushbuttons um einige Funktionen zu erweitern.

Was ich ja damit wie ich es umgesetzt habe erledige.

Was ich mittlerweile selber gemerkt habe was Unsinn ist, ist das:

Code: Alles auswählen

private: 
   QPushButton btnTest; 
Das ist mittlerweile auch draußen, der Rest ergibt für mich allerdings schon sinn, was allerdings nichts heißen soll. :-)

Wo genau würdest du anderst vorgehen? Dein Google Suchtipp bringt mich da jetzt nicht wirklich weiter, da ich den Fehler nicht sehe bzw. wie ich das mit OOP anders umsetzen sollte.
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Was franz mit unsinn meinte war die deklaration einer membervariable, welche du schon entfernt hast!

Code: Alles auswählen

private:
   QPushButton btnTest; 
Und ableiten passt schon (mehr oder weniger)so, wie du vorgegangen bist!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Mani99 hat geschrieben:Was franz mit unsinn meinte war die deklaration einer membervariable
Genau so ist es :)
Dein Google Suchtipp bringt mich da jetzt nicht wirklich weiter, da ich den Fehler nicht sehe bzw. wie ich das mit OOP anders umsetzen sollte.
Ich weiß nicht, ob dieser Punkt im zweiten Post nur unglücklich formuliert war
das es wohl funktioniert (man also die fuktionen des PushButtons ansprechen kann) mir die IntelliSense diese aber nicht anzeigt!
Aber das hat sich für mich so angehört, als hättest du mit Vererbung und anderen OOP-Konzepten (eben auch Vererbung vs. Komposition) noch Probleme, und du ließest dir von IntelliSense Programmierung beibringen :D
Leider kann ich diese Vermutung auf die Entfernung nicht überprüfen :P

Wg. Ableiten kann man nicht 100% sagen dass es passt. Wenn du beim cliked() eines QPushButton eine Aktion ausführen willst, nimmst du besser einen normalen QPushButton und connectest das SIGNAL(clicked()) auf einen eigenen SLOT (der in MainWindow oder sonst wo implementiert wird, aber nicht in einer QPushButton-Subklasse). Wenns um eigene event-handler geht ist mit Qt auch hier Ableiten nicht zwingend nötig, da kann man auch was mit eventFilter basteln (wenn deine Event-Anpassungen nicht einen extrem spezialisierten QPushButton hervorbringen). Aber auch hierzu kann man ohne genauere Infos nichts sagen.
bierber
Beiträge: 72
Registriert: 27. November 2006 14:12

Beitrag von bierber »

Ok den Unsinn hab ich verstanden, war wirklich unfugt ;-) Weiß auch nicht was ich mir dabei gedacht habe.

Ich weiß nicht, ob dieser Punkt im zweiten Post nur unglücklich formuliert war
Zitat:

das es wohl funktioniert (man also die fuktionen des PushButtons ansprechen kann) mir die IntelliSense diese aber nicht anzeigt!
Aber das hat sich für mich so angehört, als hättest du mit Vererbung und anderen OOP-Konzepten (eben auch Vererbung vs. Komposition) noch Probleme, und du ließest dir von IntelliSense Programmierung beibringen
Leider kann ich diese Vermutung auf die Entfernung nicht überprüfen
Das hab ich damit zwar nicht gemeint, doch ja es gibt noch Verständnisprobleme mit OOP aber ich denke die Grundlagen hab ich verstanden nur das komplette Aussmaß des ganzen ist mir noch nicht ganz klar. IntelliSense ist für mich als Einsteiger in QT lebenswichtig, da mir eben noch ein großer Wortschatz fehlt und ich dann über meine Erfahrungen in anderen Programmiersprachen gehen muß und die logischste Lösung an hand der Beschreibung und des Namens finden muß

Nun mal wieder zum Problem zurück:

Prinizipell hab ich das gemacht um eben gerade nicht für alle 25 Buttons die ich auf dem Widget verteile alle möglichen Funktionen nachzubilden, sondern eben das alles in dem Abgeleiteten Button habe und ich die Logik in vielen Projekten verwenden kann.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

bierber hat geschrieben:Prinizipell hab ich das gemacht um eben gerade nicht für alle 25 Buttons die ich auf dem Widget verteile alle möglichen Funktionen nachzubilden, sondern eben das alles in dem Abgeleiteten Button habe und ich die Logik in vielen Projekten verwenden kann.
Also gehst du lieber her und leitest 25x von QPushButton ab? Auch nicht so dolle, oder?
Wenn du die Funktion in QPushButton implementieren kannst, heißt das für mich dass die Funktion unabhängig ist von irgend welchen States deiner anderen UI-Komponenten (die so inm MainWindow rumfliegen). Das heißt das Dingens kann für sich alleine leben. Warum dann nicht gleich eine komplett eigene Klasse gestalten? und wenn du viel verschiedene Funktionalität implementieren willst, warum nicht über ein Interface gehen?

Code: Alles auswählen

class Runnable : public QObject {
Q_OBJECT
    virtual void doRun() =0;
public slots:
    void run() {
        doRun();
    }
};
class PingRunnable : public Runnable {
Q_OBJECT
virtual void doRun () {
    std::cout << "Ping" << std::endl;
}
};

///
MainWindow::MainWindow() {
    //// uswusf
    QPushButton *b = new QPushButton("Ping!");
    Runnable* r = new PingRunnable;
    connect(b, SIGNAL(clicked()), r, SLOT(run()));
}
So trennst du auch gleich noch Funktionalität von Anzeige :)
Antworten