Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » KDevelop / Qt / wxWidget » aus main.cpp eine Funktion in xxx.ui.h ansprechen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.08.2005, 21:31 Uhr
atlantex



Hallo,

hab ein Problem mit dem QT Designer, scheint sehr einfach aber ich beiss mir seit 2 Tagen die Zähne daran aus, also bitte nicht lachen.

Ich benutze QT3 unter Fedora Core 4.

Also, ich möchte an meiner Garage eine Lichtschranke anbringen die bei Unterbrechung ein Signal an die Parallele Schnittstelle liefert und damit ein Signal ausgelöst wird.

Ich bin nun soweit das ich die Lichtschranke "scharf schalten" kann, ebenso wird ein LPT-Pin alle 500 ms belauscht ob ein Signal anliegt, die Weitergabe an einen Signalgeber (im Test eine LED) funktioniert auch. Also techn. gesehen ist der Code funkionsbereit.

Nun zum Problem:

ich habe mir eine kleine Oberfläche "zusammengeklickt" auf der 2 Buttons sind und eine Kontrolllampe (ein Bild dient als Kontrolllampe), mit den Buttons kann ich die Lichtschranke aktivieren und deaktivieren, die Kontrolllampe zeigt den aktuellen Status an, mittels setEnabled (true) bzw. setDisabled(true).

so weit so gut.

Nun habe ich einen Timer, der sitzt in der main.cpp, dieser prüft alle 500 ms einen Pin auf Spannung, liegt sie an so schaltet er einen anderen Pin an, an dem der Signalgeber hängt, geht auch noch soweit.

Nun möchte ich in der Oberfläche noch eine Kontrolllampe einsetzen, diese soll leuchten sobald der Signalgeberpin aktiv ist, nur als optische Kontrolle.

Mein Problem ist nun dass ich die Verbindung einfach nicht auf die Reihe bekomme, also ich habe in der Oberfläche ein zusätzliches Bild eingefügt, das standardmässig auf disabled gesetz istt und möchte das es bei bedarf auf enabled wechselt.

hier mal ein paar Codeschnipsel:

[color=red]xxx.ui.h[/color]


Code:

void look::controll_led_on()

{
   controll_led->setEnabled( true );
}


void look::controll_led_off()

{
   controll_led->setDisabled( true );
}






[color=red]main.cpp[/color]


Code:

    if (pin_is_set(LP_PIN11))        //check the satus of pin 11

    {
    clear_pin(LP_PIN02);
     look *w = new look();
    w->controll_led_off()
    }
else
    {
    set_pin(LP_PIN02);
    look *w = new look();
    w->controll_led_on()
}





wenn ich im Formteil in die on / off Funktionen jeweils ein printf mit reinsetze und das Proggi via Commandozeile starte sehe ich das die Funktionen ausgeführt werden, nach dem stoppen sehe ich eine 0 oder 1, je nach Schaltzustand, also er greift von der main.cpp schonmal in die xxx.ui.h rüber, jedoch enabled bzw. disabled er mir das LED Bild einfach nicht.


ein Tip wäre super



Danke

atlantex
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.08.2005, 10:03 Uhr
Th



Du erstellst ja mittels "new look()" jeweils eine neue Instanz. Wie ist denn "controll_led" in der Klasse "look" initialisiert?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.08.2005, 10:15 Uhr
RHBaum



Also ich arbeite nich mit dem designer, deshalb kann ich bei den ui's schlecht tips geben ...

Aber prinzipiell:

deine GUI - Objecte haben ja alle Signale und Slots, die man nur verdrahten muss ....

Was du brauchst iss nur nen Umsetzer ....
Also in deinem falle ein Object, was Signale und Slots kann (Ableiten von QObject), was deine Informationen von deinem System (Lichtschranke) in nen Signal umsetzt ....

Also ich wurds so umschreiben, dass du nen standard klasse (ohne QT ohne Nix) hasst, wo du einfach nur den Status der Lichtschranke abfragen kannst.

Dann eine Klasse abgeleitet von QObject, welche eine Instanz deiner obigen klasse beinhaltet. dieser Klasse spendierst nen OnTimer Slot, welcher von nem Externen Timer aufgerufen werden kann ... (wichtig, eigene timer / threads duerfen nie auf die QT GUI direkt schreiben, das gibt salat).
wird dieser Slot aufgerufen, checkt er den status deiner Lichtschranken klasse, und generiert nen Signal OnLSStatus(bool status) wo fuer den boolschen status steht, ob die lichtschranke ausgeloest iss oder nich ...

Nun isses ganz einfach ....
Erzeug nen Widget/Mainwindow wo dein Bild drin ist, was veraendern willst.
Im Konstruktor deines Widget/mainwindows legst ne Instanz der obigen von QObject abgeleiteten klasse an ...
verbindest das OnLSStatus Signal mit dem Enable Slot deines Bildes (wenn sie gleiche signatur haben, ansonsten musst du noch nen SIgnal /Slotpaar direkt am Widget/Mainwindow zwischenschalten)
Dann kreirst am Widget/Mainwindow nen timer, desen SIgnal verbindest mit dem OnTimer Slot deiner anderen Klasse ...
Und vioala, sollte laufen ....

QT = signal /slots ... das solltest dir prinzipiell noch mal anschauen !!!
wichtig iss halt, dass auf die QT GUI immer nur ein Thread arbeiten darf ... sobald du mit nem anderen thread da draufrumschreibst ... gibts undefiniertes verhalten.
Also deine Enabled slots der LED's sollte nur nen Timer Event von deinen Windows oder der Hauptpfad deiner main selber setzen, oder natuerlich von SLots deiner anderen GUI Elemente aus ...

Ciao ...

Dieser Post wurde am 09.08.2005 um 10:30 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.08.2005, 15:56 Uhr
atlantex



Hallo,


Zitat:
Wie ist denn "controll_led" in der Klasse "look" initialisiert?


tja, höchstwarscheinlich garnet

um ehrlich zu sein, dass ist genau der Punkt wo es hängt, den ich noch nicht verstehe wie das gemacht wird.


Ich habe noch etwas in anderen Foren gesucht, sieht so aus als würde mir da einiges fehlen...

Hier mal der komplette Code, wie es techn. soweit läuft:


xxx.ui.h



C++:


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <parapin.h>
#include <qlabel.h>


void look::led_on_slot()
{
if (pin_init_user(LPT1) < 0)
  exit(0);

  pin_output_mode(LP_PIN03);

  set_pin(LP_PIN03);
  //look::foerder_on_led();                 //test
}


void look::led_off_slot()
{
if (pin_init_user(LPT1) < 0)
  exit(0);
  pin_output_mode(LP_PIN03);

  clear_pin(LP_PIN03);
//look::foerder_off_led();                 //test
}



void look::foerder_on_led()
{
    foerder_led->setEnabled( true );
    printf("1");                                       //nur zum test
}


void look::foerder_off_led()
{
    foerder_led->setDisabled( true );
    printf("0");                                      //nur zum test
}





main.cpp



C++:


#include <qapplication.h>
#include <qtimer.h>
#include <qmessagebox.h>
#include "look.h"
#include <parapin.h>


class Lichtschranke : public QWidget{
   Q_OBJECT
  
public:
   Lichtschranke(QWidget *parent=0, const char *name=0)
   {
      QTimer *zeit=new QTimer(this);
      QObject::connect(zeit, SIGNAL(timeout()), SLOT(zeigeZeit()));
      zeit->start(500, false);
      zeigeZeit();
   }
  
private slots:
   void zeigeZeit()
   {
   if (pin_init_user(LPT1) < 0)
      exit(0);            //exit if you are NOT root !!
      
      pin_input_mode(LP_PIN11);      //set pin 11 to INPUT mode
      pin_output_mode(LP_PIN02);
      
      if (pin_is_set(LP_PIN11))      //check the satus of pin 11
    {
    clear_pin(LP_PIN02);
    look *w = new look();
    w->foerder_off_led();
    }
else
    {
    set_pin(LP_PIN02);
    look *w = new look();
    w->foerder_on_led();
}
      
}
};






#include "licht.moc"      //needet by Q_OBJECT


int second()        
{
    Lichtschranke *lichtschr=new Lichtschranke;
}


int main( int argc, char *argv[] )
{
    QApplication a( argc, argv );
    look *w = new look();
    w->show();
    second();
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
    return a.exec();
}





Auf dem Form befindet sich jetzt ein Bild (foerder_led) das enabled oder disabled werden soll.



Grüsse

atlantex
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ KDevelop / Qt / wxWidget ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: