Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Bekanntmachung eines Objekts

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.07.2005
    Ort
    GM
    Beiträge
    10

    Bekanntmachung eines Objekts

    Hi zusammen

    Es sind seit heute Semesterferien und da habe ich mir gedacht versuche ich mich doch
    mal ein wenig an c++. Habe schon gewisse Erfahrung mit c und Java, deswegen bin ich wohl kein
    Programmieranfänger mehr. Das ich aber wirklich gut programmieren kann will ich nun auch wieder nicht
    behaupten. o_0


    Nun zu meinem Problem

    Ich habe eine kleine Anwendung mit kdev "geschrieben", was mit hilfe des einsteiger
    Tutorials auch nicht so schwer war. Zumindest mit der nötigen Motivation nicht. :]

    Mein Problem liegt jetzt aber in der OOP .. Ich habe eine GUI erstellt und kann den
    Knöpfen auch Aktionen zuweisen. Das Problem ist allerdings, dass ich nur aus der zum
    Knopf gehörenden Funktion die anderen GUI Elemente ansprechen kann. Schreibe ich eine
    andere Funktion und will dann von da, z.B. Text in ein Textfeld schreiben, dann findet
    er das Element aus der Funktion herraus nicht. Ist mir auch halbwegs klar, dass der anderen
    Funktion mein GUI Element nicht bekannt ist. Ich schaffs allerdings nicht das zu ändern.
    Wenn jemand als Erfahrung im Umgang mit kdev und QT hat wäre ich für ein paar Tieps dankbar.

    Code:
    /*$SPECIALIZATION$*/
    void kajguiWidget::button_clicked()
    {
    
        if ( label->text().isEmpty() )
        {
            label->setText( "Hello World!" );
    
        }
        else
        {
            label->clear();
        }
    
    }
    (Es geht darum "label" in einer anderen Funktion nutzen zu können)

    bye

    Andy

  2. #2
    Registrierter Benutzer
    Registriert seit
    29.02.2004
    Beiträge
    113
    Bitte?
    Hast du denn 'label' überhaupt in der Klassendefinition aufgeführt?

    Gruß,
    /dev

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.07.2005
    Ort
    GM
    Beiträge
    10
    Also .. das Label hat mir ja der GUI editor angelegt und taucht so nicht in den cpp
    Dateien auf. Ich weiss auch nicht wo ich da was bekannt machen muss.

  4. #4
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    PHP-Code:
    void kajguiWidget::button_clicked() 
    Wenn ich das richtig sehe ist diese Funktion ein SLOT.
    Zeige bitte mal den Konstruktor, so kann man nichts schreiben.
    PHP-Code:
    #ifndef _SLOTDEFINITIONEN_H_
    #define _SLOTDEFINITIONEN_H_

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif

    #include <kmainwindow.h>

    class QLabel;
    class 
    QPushButton;
    class 
    QGridLayout;

    class 
    SlotDefinitionen : public KMainWindow
    {
            
    Q_OBJECT

    protected:
            
    QGridLayout *Layout;
            
    QLabel *label;
            
    QPushButton *btn;

    public:
            
    SlotDefinitionen();
            
    virtual ~SlotDefinitionen();

    public 
    slots:
            
    void machwas();

    };

    #endif // _SLOTDEFINITIONEN_H_ 
    PHP-Code:
    #include "slotdefinitionen.h"

    #include <qlabel.h>
    #include <qlayout.h>
    #include <qpushbutton.h>

    #include <kmainwindow.h>
    #include <klocale.h>
    #include <kdebug.h>

    SlotDefinitionen::SlotDefinitionen() : KMainWindow0"SlotDefinitionen" )
    {
            
    Layout = new QGridLayoutthis11116"Layout");

            
    label = new QLabel"Hello World"this"hello label" );
            
    Layout->addWidgetlabel0);

            
    btn = new QPushButtonthis"Button" );
            
    btn->setText"Sende" );
            
    Layout->addWidgetbtn1);

            
    connectbtnSIGNALclicked() ), thisSLOTmachwas() ) );
    }

    void SlotDefinitionen::machwas()
    {
            
    label->setText"machwas()" );
            
    kdDebug() << "Signal cklicked() wurde aufgerufen." << endl;
    }

    SlotDefinitionen::~SlotDefinitionen()
    {}

    #include "slotdefinitionen.moc" 
    Geändert von undefined (19-07-2005 um 21:29 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von sxe
    Also .. das Label hat mir ja der GUI editor angelegt und taucht so nicht in den cpp
    Dateien auf. Ich weiss auch nicht wo ich da was bekannt machen muss.

    In diesem Fall hat es uic als public Member angelegt, also kein Problem.
    Sollte daher in jeder Methode dieser Klasse benutzbar sein.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    19.07.2005
    Ort
    GM
    Beiträge
    10
    Tag .. erstmal danke für die Hilfe.

    Ich habe folgende Dateien.

    1. main.cpp
    Code:
    #include "kajgui.h"
    #include <kapplication.h>
    #include <kaboutdata.h>
    #include <kcmdlineargs.h>
    #include <klocale.h>
    
    static const char description[] =
        I18N_NOOP("A KDE KPart Application");
    
    static const char version[] = "0.1";
    
    static KCmdLineOptions options[] =
    {
    //    { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
        KCmdLineLastOption
    };
    
    int main(int argc, char **argv)
    {
        KAboutData about("kajgui", I18N_NOOP("kajgui"), version, description,
                         KAboutData::License_GPL, "(C) 2005 sxe", 0, 0, "xx");
        about.addAuthor( "sxe", 0, "xx" );
        KCmdLineArgs::init(argc, argv, &about);
        KCmdLineArgs::addCmdLineOptions( options );
        KApplication app;
        kajgui *mainWin = 0;
    
        if (app.isRestored())
        {
            RESTORE(kajgui);
        }
        else
        {
            // no session.. just start up normally
            KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
    
            /// @todo do something with the command line args here
    
            mainWin = new kajgui();
            app.setMainWidget( mainWin );
            mainWin->show();
    
            args->clear();
        }
    
        // mainWin has WDestructiveClose flag by default, so it will delete itself.
        return app.exec();
    }

    2. kajguiwidget.cpp
    Code:
    #include <qlabel.h>
    
    #include "kajguiwidget.h"
    #include <klistview.h>
    
    #include <stdio.h>
    #include <libxml/xmlreader.h>
    
    char* attr;
    
    
    kajguiWidget::kajguiWidget(QWidget* parent, const char* name, WFlags fl)
            : kajguiWidgetBase(parent,name,fl)
    {}
    
    kajguiWidget::~kajguiWidget()
    {}
    
    
    static void
    test(const char *filename) {
    
    // hier ist label nicht verfügbar..
    
    }
    
    /*$SPECIALIZATION$*/
    void kajguiWidget::button_clicked()
    {
    
        if ( label->text().isEmpty() )
        {
            label->setText( "Hello World!" );
    
        }
        else
        {
            label->clear();
        }
    
    }
    
    
    
    #include "kajguiwidget.moc"

    3. kajgui.cpp
    Code:
    #include <kmainwindow.h>
    #include <klocale.h>
    
    #include "kajgui.h"
    #include "kajguiwidget.h"
    
    kajgui::kajgui()
        : KMainWindow( 0, "kajgui" )
    {
        setCentralWidget( new kajguiWidget( this ) );
    }
    
    kajgui::~kajgui()
    {
    }
    
    #include "kajgui.moc"
    Bei 2. ist Label in der Funktion test nicht verfügbar. Zusätzlich habe ich noch eine ui
    datei kajguiwidgetbase.ui.

    Ich hoffe das hilft weiter.

    bye

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ja, ist logisch, die Funktion test gehört ja auch nicht zur Klasse kajguiWidget.

    Wenn du eine Methode draus machst, ist dort label auch sichtbar.

    Wenn du aus unerfindlichen Gründen einen reine C Funktion brauchen solltest, könntest du das Label als Parameter mitübergeben.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    Registrierter Benutzer
    Registriert seit
    19.07.2005
    Ort
    GM
    Beiträge
    10
    Hi

    Wie schon oben gesagt kenne ich mich mit c++ nicht aus. Ich habe die Funktion
    einfach wie ich es aus c gewöhnt bin angelegt. Kannst du mir ein Beispiel
    geben wie man eine Methode in c++ anlegt?

    Danke

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Kein Problem

    Du mußt ansich nur die Funktion als Teil der Klasse deklarieren, also den Funktionsprototyp innerhalb der class {}; Deklaration einfügst
    Code:
    class kajguiWidget : public kajguiWidgetBase
    {
    private:
        void test(const QString& filename);
    };
    mal als private deklariert.

    In der .cpp Datei dann wie jede andere Klassenfunktion, bzw. jetzt Methode genannt, implementieren
    Code:
    void kajguiWidget::test(const QString& filename)
    {
    }
    Man kann natürlich wie in C auch mit unabhängigen Funktionen arbeiten und alle nötigen Parameter übergeben, aber üblicherweise verändern Funktionen ohnehin nur wieder den Zustand eines Objekts und können daher Methoden der jeweiligen Klasse sein.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •