QT Anfänger Frage. seltsame fehler!

Alles rund um die Programmierung mit Qt
Antworten
mustache
Beiträge: 3
Registriert: 13. Mai 2013 20:51

QT Anfänger Frage. seltsame fehler!

Beitrag von mustache »

viel code:

Coin.h

Code: Alles auswählen

#include <QString>

#ifndef COIN_H
#define COIN_H
class Coin{
private:

public:
        //Member
        int value;
        QString name;
        //Constructors
        Coin(int _v, QString _n):value(_v),name(_n){};
};
#endif // COIN_H

CoinMagazine.h

Code: Alles auswählen

#include "Coin.h"

#include <iostream>
#include <stack>
#include <QStack>



#ifndef COINMAGAZINE_H
#define COINMAGAZINE_H



class CoinMagazine{

private:
        //magazine
        QStack<Coin> CHF5Stack;
        QStack<Coin> CHF2Stack;
        QStack<Coin> CHF1Stack;
        QStack<Coin> R50Stack;
        QStack<Coin> R20Stack;
        QStack<Coin> R10Stack;
        int maxSize;
        // Coin Types
        Coin CHF5;
        Coin CHF2;
        Coin CHF1;
        Coin R50;
        Coin R20;
        Coin R10;

public:
        //CoinMagazine(int _ms): maxSize(_ms);
        CoinMagazine():
                //Max magazine size
                maxSize(20),
                //Defines the coins
                CHF5(500,"5Fr"),
                CHF2(200,"2Fr"),
                CHF1(100,"1Fr"),
                R50(50,"0.5Fr"),
                R20(20,"0.2Fr"),
                R10(10,"0.1Fr")
        {
                // Starts magazine with 10 coins per type.
                depositCoin(CHF5,10);
                depositCoin(CHF2,10);
                depositCoin(CHF1,10);
                depositCoin(R50,10);
                depositCoin(R20,10);
                depositCoin(R10,10);
        };

                QStack<Coin>& selectCoinMagazine(Coin _c){
                switch(_c.value){
                case 500: return CHF5Stack; break;
                case 200: return CHF2Stack; break;
                case 100: return CHF1Stack; break;
                case 50: return R50Stack; break;
                case 20: return R20Stack; break;
                case 10: return R10Stack; break;
                }
        }

        bool depositCoin(Coin _c,int n){
                for(int i = 0;i<n;i++){
                        if(selectCoinMagazine(_c).size() < maxSize){
                        selectCoinMagazine(_c).push(_c);
                        }
                        else{
                                return false;
                        }
                }
                return true;
        }
#endif // COINMAGAZINE_H

TicketMachine.h

Code: Alles auswählen

#include "CoinMagazine.h"
#include "Coin.h"

#ifndef TICKETMACHINE_H
#define TICKETMACHINE_H

class TicketMachine{
private:
        CoinMagazine cm;
        int balance;

public:

        TicketMachine():cm(), balance(0){
        }



        bool recieveCoin(Coin _c){
                if(cm.depositCoin(_c) == true){
                        balance = balance + _c.value;
                }
                else{

                }
        }

        bool requestCoin(Coin _c){

        }

};

#endif // TICKETMACHINE_H
Main.cpp

Code: Alles auswählen

#include <QtGui/QApplication>
#include "mainwindow.h"
#include "CoinButton.h"
#include "Coin.h"
#include "TicketMachine.h"

#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QApplication>
#include <QTextEdit>
#include <QString>






int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //Widgets
    QWidget* win = new QWidget;

    QHBoxLayout* HLayout = new QHBoxLayout(win);
    QVBoxLayout* VLayout = new QVBoxLayout(win);

    //Buttons
    CoinButton* but1 = new CoinButton("5Fr");
    CoinButton* but2 = new CoinButton("2Fr");
    CoinButton* but3 = new CoinButton("1Fr");
    CoinButton* but4 = new CoinButton("50R");
    CoinButton* but5 = new CoinButton("20R");
    CoinButton* but6 = new CoinButton("10R");


    //TextField
    QTextEdit* TBox = new QTextEdit;


    //Button Resize
    but1->resize(100,30);
    but2->resize(100,30);
    but3->resize(100,30);
    but4->resize(100,30);
    but5->resize(100,30);
    but6->resize(100,30);
    //Button values set up

    //Set up VLayout
    VLayout->addWidget(but1);
    VLayout->addWidget(but2);
    VLayout->addWidget(but3);
    VLayout->addWidget(but4);
    VLayout->addWidget(but5);
    VLayout->addWidget(but6);

    //Set Up HLayout
    HLayout->addWidget(TBox);
    HLayout->addLayout(VLayout);

    //Set Up Text Field
    TBox->setReadOnly(true);

    TicketMachine tm = TicketMachine();

    TBox->setPlainText(TicketMachine.cm.CHF5Stack.size());

    win->show();
    return a.exec();
}



Ich kann meinen code nicht kompillieren. wenn ich meine main laufen lasse OHNE die files coin.h coinmagazine.h oder ticketmachine.h dann gibts mir das fenster mit buttons etc ohne problem.


Lasse ich die main laufen, entferne aber alles was mit dem TicketMachine.h zu tun hat dann gehts auch ganz schön.

füge ich dann TicketMachine hinzufüge bekomme ich gegen die 30 Fehler, viele davon in Qlayoutitem.
auch wenn die class Ticketmachine so definiert ist:

Code: Alles auswählen

class TicketMachine{
}
Ich habe die drei Klassen alle im Visual Studio ohne dem ganzen GUI zeug ausprobiert(natürlich mit stack anstatt Qstack etc) und da kompilieren sie einwand frei. Was ist da los?

CoinButton ist übrigens nichts anderes als eine kopie von QPushbutton:

Code: Alles auswählen

#ifndef COINBUTTON_H
#define COINBUTTON_H

#include <QPushButton>

class CoinButton : public QPushButton
{
    Q_OBJECT
    public:

        CoinButton(const QString& title, QWidget *parent = 0);

};

#endif // COINBUTTON_H

Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QT Anfänger Frage. seltsame fehler!

Beitrag von Christian81 »

Die Compiler-Fehlermeldungen wären schon nicht schlecht. Und ein minimales Projekt als zip-Anhang inklusive pro-Datei wäre auch von Vorteil.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mustache
Beiträge: 3
Registriert: 13. Mai 2013 20:51

Re: QT Anfänger Frage. seltsame fehler!

Beitrag von mustache »

Im Anhang das gesamte Projekt

Ein paar Fehlermeldungen. Insgesamt sind es 28..

C:/Users/mustache/Documents/TicketMachineV1/../../../../Qt/2009.05/qt/include/QtGui/../../src/gui/kernel/qlayoutitem.h:93: error: cannot define member function 'CoinMagazine::QLayoutItem::QLayoutItem' within 'CoinMagazine'

C:/Users/mustache/Documents/TicketMachineV1/../../../../Qt/2009.05/qt/include/QtGui/../../src/gui/kernel/qlayoutitem.h:165: error: field 'q_cachedMinimumSize' has incomplete type

C:/Users/mustache/Documents/TicketMachineV1/../../../../Qt/2009.05/qt/include/QtGui/../../src/gui/kernel/qlayoutitem.h:166: error: field 'q_cachedSizeHint' has incomplete type

C:/Users/mustache/Documents/TicketMachineV1/../../../../Qt/2009.05/qt/include/QtGui/../../src/gui/kernel/qlayoutitem.h:167: error: field 'q_cachedMaximumSize' has incomplete type

C:/Users/mustache/Documents/TicketMachineV1/../../../../Qt/2009.05/qt/include/QtGui/../../src/gui/kernel/qlayoutitem.h:168: error: field 'q_cachedHfws' has incomplete type

C:/Users/mustache/Documents/TicketMachineV1/../../../../Qt/2009.05/qt/include/QtGui/../../src/gui/kernel/qlayout.h:57: error: declaration of 'typedef enum QtValidLicenseForGuiModule CoinMagazine::QtGuiModule'

C:/Users/mustache/Documents/TicketMachineV1/../../../../Qt/2009.05/qt/include/QtGui/../../src/gui/kernel/qlayoutitem.h:54: error: conflicts with previous declaration 'typedef enum QtValidLicenseForGuiModule CoinMagazine::QtGuiModule'
Dateianhänge
TicketMachineV1.zip
Projekt
(9.99 KiB) 204-mal heruntergeladen
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: QT Anfänger Frage. seltsame fehler!

Beitrag von odt »

in CoinMagazine.h fehlt ein }; um die Klassendefinition abzuschliessen.
PS: ich glaube mit #pragma once anstelle des #ifdef def endif in jedem Header, hätte der Compiler ne bessere Meldung ausgespuckt.
TIP: ne cpp für jedes h (Trennung Deklaration und Implementation
ODT Informatik GmbH, Reto Tschofenig
mustache
Beiträge: 3
Registriert: 13. Mai 2013 20:51

Re: QT Anfänger Frage. seltsame fehler!

Beitrag von mustache »

Vielen dank! hat geklappt. hast du das aus den Fehlermeldungen herausgefunden, bzw kann mann das überhaupt? Oder ist es dir einfach so aufgefallen?

Eine Weitere Frage: ich möchte ich dass in meine Projekt eine Klasse ein eigenes Signal hat welches mit dem Slot setPlainText() des QTextEdit verbunden ist. wird also das signal ausgelöst soll sich die QTextEdit aktualisieren.

Code: Alles auswählen

class TicketMachine: public QObject{
Q_OBJECT
private:
//private Methoden /Member
public:
// Public Methoden/ Member
signals:
         QString updateScreen(QString text){
                 emit text;
         }
}
Dann die verknüpfung:

Code: Alles auswählen

QTextEdit* TBox = new QTextEdit;
TicketMachine* tm = new TicketMachine;

QObject::connect(tm,SIGNAL(updateScreen(QString)),TBox,SLOT(setPlainText(QString)));

Wenn in meiner Klasse nun updateScreen("hello World") aufgerufen wird sollte dass doch den text als parameter für setPlainText() von dem TBox mitgeben. leider funktioniert dies nicht.

Ich erhalte die folgenden Meldungen:

C:/Users/mustache/Documents/TicketMachineV1/TicketMachine.h:96: warning: no return statement in function returning non-void
C:/Users/mustache/Documents/TicketMachineV1/TicketMachine.h:96: Error: Not a signal declaration
C:/Users/mustache/Documents/TicketMachineV1/TicketMachine.h:95: warning: statement has no effect

Im Anhang das Ganze Projekt
Dateianhänge
TicketMachineV1.zip
(10.88 KiB) 202-mal heruntergeladen
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: QT Anfänger Frage. seltsame fehler!

Beitrag von odt »

Naja, die Fehlermeldung deutete auf CoinMagazine und da ich schon einigen solchen Fehlern hatte... Zwar sind die Fehlermeldung kryptisch, und dennoch lesbar und hilfreich...

Die erste deutet darauf hin, dass Dein updateScreen ein return QString( "irgendwas" ) haben sollte.
Die Zweite, dass das updateScreen nicht wie ein Signal aussieht: ein Signal kann keinen Return-Wert haben und hat keine Implementation respektive diese wird von qt (qmake) generiert.
Die Dritte, dass ein Parameter zu emitten irgendwie keinen Sinn macht.

Mit einem Signal melden Deine TicketMaschine, dass irgendwas passiert ist.
Daher im TicketMachine.h im updateScreen keine geschweiften Klammern und kein Code:
signals:
void updateScreen( QString text );
Nun kannst Du anderswo ein emit machen. Z.B.
void TicketMachine::ticketLoesen(){
...
emit updateScreen( "Geld einwerfen" );
...
}

Tip: Trenne die Deklaration von der Implementation, d.h. trenne Deinen Source in Header und Cpp. Das ist nicht nur übersichtlicher, sondern bald auch notwendig. Und je später Du das machst, desto aufwendig.
ODT Informatik GmbH, Reto Tschofenig
Antworten