Seite 1 von 1
Verständnisproblem beim Ableiten von Klassen am Bsp.: QPushB
Verfasst: 22. November 2010 11:59
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
Verfasst: 22. November 2010 12:00
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
Verfasst: 22. November 2010 12:25
von upsala
Du leitest von QPushButton ab und hast eine Member-Variable vom Typ QPushButton.
Verfasst: 22. November 2010 12:53
von bierber
Hallo,
ok, was genau bedeutet das? Und wie bekomme ich das dann in die IntelliSense von VS08?
MFG
Felix
Verfasst: 22. November 2010 14:03
von franzf
bierber hat geschrieben:ok, was genau bedeutet das?
Dass du Unsinn treibst

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.
Verfasst: 22. November 2010 15:14
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:
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.
Verfasst: 22. November 2010 15:53
von Mani99
Was franz mit unsinn meinte war die deklaration einer membervariable, welche du schon entfernt hast!
Und ableiten passt schon (mehr oder weniger)so, wie du vorgegangen bist!
Verfasst: 22. November 2010 16:38
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

Leider kann ich diese Vermutung auf die Entfernung nicht überprüfen
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.
Verfasst: 23. November 2010 08:40
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.
Verfasst: 23. November 2010 09:00
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
