lara hat geschrieben:
mit " von außen" meinte ich z.B wenn man meine GUI mit eigenem Programm steuern will.
einfach per read() und write() auf meine exe-Datei zugreifen.

ich verstehe von mal zu mal weniger... Also:
- du hast ein "Liftsimulator" in Form eines Gerätes mit Tasten und Lampen usw.
- weiter hast du ein Treiber dafür geschrieben, welcher du mit einem einfachen C-Programm getestet hast (der Treiber funktioniert, oder?)
- nun möchtest du eine GUI, mit welcher du
1. den aktuellen Zustand (Lampen/Schalter) anzeigen und
2. später auch noch steuern (ein/aus) möchtest.
- Weil Qt keine einfache "LED" hat, hast du KLed von KDE eingesetzt.
Wenn ich dich richtig verstehe, weisst du nun zwar, wie du den Status auslesen kannst, aber nicht, wie du ihn anzeigen sollst.
Also:
Du kannst kein "while (1)" mehr nehmen, weil alle graphischen Frameworks einen Eventloop (Maus/Tastatur/graphische Updates/Timer/usw.) besitzen. Daher musst du nun einen Timer aufsetzen, über welchen du periodisch (z.B. mit 10Hz) den Status ausliest und dann die Instanzen der GUI steuerst. Dies kannst du mit einem eigenen QTimer machen, oder die Timer-Methoden der QObject-Klasse verwenden:
Code: Alles auswählen
myGui ::myGui ()
{
...
startTimer(100); // 100ms -> 10Hz
}
void myGui::timerEvent(QTimerEvent *event)
{
read(fd_simu,&lamps,sizeof(lamps));
qDebug() << "myGui::timerEvent" << lamps; // Status auf Konsole ausgeben;
for (int i=0; i<15; i++)
led[i]->setState( (1 << i) & lamps ? KLed::On : KLed::Off);
}
Siehe auch
http://doc.trolltech.com/4.6/qobject.html#startTimer (Timer in QObject)
http://doc.trolltech.com/4.6/qtimer.html#details (QTimer)
Dann noch ein paar weitere Punkte: eine GUI sollte nicht einfach so "hingeknallt" werden sondern sollte genau so sorgfälltig gemacht werden wie der Rest des Projektes (Treiber und Hardware).
Also:
- überlege dir sinnvolle Strategien bei der Namengebung ("myGui" ist Mist)
- verwende soweit möglich Qt-Klassen (QFile)
- denke objektorientiert; evt. lohnt es sich, für das Hardware-Interface (read/write-Aufrufe) eine eigene Klasse zu schreiben ("LiftInterface" oder so)
- void myGui::setbit() ist viel zu gross, verwende QSignalMapper!
- verwende für den UI-Entwurf den Designer, das ist einfacher. Wie du dann die UI-Datei anwenden kannst, steht hier:
http://doc.trolltech.com/4.6/designer-u ... -file.html
- Mit KLed bist von was grossem abhängig (KDE), obwohl das auch in Qt nicht so schwierig wäre. Es ist ok, wenn du dein Programm vorerst mit KLed in Betrieb nimmst, aber ich würde mich noch um einen Qt-Ersatz kümmern (eigenes QWidget, welches im paintEvent das LED malt).
hth..