Hallo,
ich habe in meinem QWidget eine Methode AppendText, die einen übergebenen Text an meinen QTextBrowser in der Oberfläche anfügt. Das QWidget wird in der main()-Methode per show() aufgerufen, ist also meine "Haupt"-Klasse.
Nun habe ich Unterklassen, die ebenfalls auf die AppendText-Methode zugreifen sollen können um auch Mitteilungen zur Ausgabe zu bringen.
Das ui-Element (ich arbeite unter Qt4.4) ist private und nicht statisch. Ich müsste also meine AppendText-Methode und das ui-Objekt statisch machen. Das finde ich allerdings unschön.
Da bin ich sicherlich nicht der erste der sich vor so ein Problem gestellt hat. Wie löst Ihr das?
Mfg KK
Aus Unterklassen auf Funktion in QWidget zugreifen
-
KartoffelKiffer
- Beiträge: 101
- Registriert: 27. Februar 2008 15:59
Aus Unterklassen auf Funktion in QWidget zugreifen
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:09, insgesamt 1-mal geändert.
-
KartoffelKiffer
- Beiträge: 101
- Registriert: 27. Februar 2008 15:59
-
KartoffelKiffer
- Beiträge: 101
- Registriert: 27. Februar 2008 15:59
Hallo,
nochmals zu meinem Problem. Ein explizites Beispiel wäre wiefolgt:
Es gibt eine Hauptklasse Baum, die dem Dialog entspricht. Diese Klasse bildet n Instanzen von der Klasse Blaetter. Jede Blaetter-Klasse ruft einen Thread Photosynthese auf. Nehmen wir an, dass der Thread noch eine Instanz erstellen kann, welche dann auch die unterste Schicht meiner Hierarchie darstellt.
Diese unterste Schicht, die Instanz in dem Thread Photosynthese, soll nun eine Funktion in der Klasse Baum aufrufen. Es besteht kein direkter Verbund zwischen diesen zwei Klassen, höchstens dass sie in dem selben Prozess laufen.
Ich müsste also entweder die Klasse Baum (bzw. einen Zeiger darauf) durch alle Instanzen und Threads durchschleifen (QObject *parent) oder ich emittiere ein SIGNAL ganz unten an den Thread, der wiederrum an die aufrufende Klasse Blaetter, und diese wiederrum an die Dialog-Klasse Baum, welche entgültig die Mitteilung zur Ausgabe bringt.
Könnte man so etwas nicht über den globalen Zeiger qApp handlen?
Ich starte meinen Dialog über eine main()-Methode mit dem Aufruf
Ist es nicht möglich diese Instanz (d) irgendwie public zu machen, sodass ich sagen kann
Mfg KK
nochmals zu meinem Problem. Ein explizites Beispiel wäre wiefolgt:
Es gibt eine Hauptklasse Baum, die dem Dialog entspricht. Diese Klasse bildet n Instanzen von der Klasse Blaetter. Jede Blaetter-Klasse ruft einen Thread Photosynthese auf. Nehmen wir an, dass der Thread noch eine Instanz erstellen kann, welche dann auch die unterste Schicht meiner Hierarchie darstellt.
Diese unterste Schicht, die Instanz in dem Thread Photosynthese, soll nun eine Funktion in der Klasse Baum aufrufen. Es besteht kein direkter Verbund zwischen diesen zwei Klassen, höchstens dass sie in dem selben Prozess laufen.
Ich müsste also entweder die Klasse Baum (bzw. einen Zeiger darauf) durch alle Instanzen und Threads durchschleifen (QObject *parent) oder ich emittiere ein SIGNAL ganz unten an den Thread, der wiederrum an die aufrufende Klasse Blaetter, und diese wiederrum an die Dialog-Klasse Baum, welche entgültig die Mitteilung zur Ausgabe bringt.
Könnte man so etwas nicht über den globalen Zeiger qApp handlen?
Ich starte meinen Dialog über eine main()-Methode mit dem Aufruf
Code: Alles auswählen
MeinDialog d;
d.show();
Code: Alles auswählen
qApp->m_Dialog->AppendText("ein text...");
Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:10, insgesamt 1-mal geändert.
-
KartoffelKiffer
- Beiträge: 101
- Registriert: 27. Februar 2008 15:59
Hallo,
ich habe einen ersten Ansatz gefunden.
Es existieren in meinem Beispiel drei Klasse:
- MainWindow "Test"
- Connection Interface
- Thread-Klasse mit run()-Methode
Aus der run-Methode soll nun eine Mitteilung an das MainWindow gesendet werden, und dort in einem QTextBrowser zur Anzeige gebracht werden.
Die ConnectionIFC-Klasse ist von QEvent abgeleitet und beinhaltet im Konstruktor die Übergabe eines Typen als int und eines QStrings, welcher in einer Member-Variable m_Msg abgespeichert wird.
In der Thread-Instanz wird im Konstruktor folgender Code ausgeführt
Dort werden alle vorhandenen Widgets (das MainWindow fällt darunter) durchlaufen, bis der objectName von meinem MainWindow erreicht wurde. Dieses Window wird dann zu meinem MainWindow (der Dialog-Klasse "Test") gecastet.
Somit erhalte ich einen Pointer auf meine Dialog-Klasse, der in m_Test steht.
An der Stelle wo ich eine Mitteilung in dem TextBrowser sichtbar machen möchte (in dem Thread), sende ich ein Event mittels
Um auf das Event reagieren zu können, muss ich noch die event-Funktion in meinem MainWidget überlagern. Das sieht wiefolgt aus:
Dort caste ich das Event in ConnectionIFC und hole mir daraus die Message, die ich zuvor abgespeichert habe.
Das sieht etwas wüst aus, ich weiß. Aber es ist wie gesagt erst ein Ansatz.
Über Vorschläge und Kritik wäre ich sehr dankbar.
Mfg KK
ich habe einen ersten Ansatz gefunden.
Es existieren in meinem Beispiel drei Klasse:
- MainWindow "Test"
- Connection Interface
- Thread-Klasse mit run()-Methode
Aus der run-Methode soll nun eine Mitteilung an das MainWindow gesendet werden, und dort in einem QTextBrowser zur Anzeige gebracht werden.
Die ConnectionIFC-Klasse ist von QEvent abgeleitet und beinhaltet im Konstruktor die Übergabe eines Typen als int und eines QStrings, welcher in einer Member-Variable m_Msg abgespeichert wird.
In der Thread-Instanz wird im Konstruktor folgender Code ausgeführt
Code: Alles auswählen
Test *m_Test = NULL;
QWidgetList widgets = QApplication::allWidgets();
for (int i = 0; i < widgets.size(); ++i)
{
if (QString::compare(widgets.at(i)->objectName(), "TestClass", Qt::CaseInsensitive) == 0)
{
m_Test = (Test *)widgets.at(i);
}
}
Somit erhalte ich einen Pointer auf meine Dialog-Klasse, der in m_Test steht.
An der Stelle wo ich eine Mitteilung in dem TextBrowser sichtbar machen möchte (in dem Thread), sende ich ein Event mittels
Code: Alles auswählen
qApp->postEvent((QObject *)m_Test, new ConnectionIFC(1001, "DIE MITTEILUNG."));
Code: Alles auswählen
bool Test::event(QEvent *e)
{
bool rv = true;
switch (e->type())
{
// *** Append text to output ***
case 1001:
AppendText(((ConnectionIFC *)e)->m_Msg);
break;
default:
rv = QWidget::event(e);
break;
}
return rv;
}
Das sieht etwas wüst aus, ich weiß. Aber es ist wie gesagt erst ein Ansatz.
Über Vorschläge und Kritik wäre ich sehr dankbar.
Mfg KK