2017-12-20 23 views
0

Ich versuche, ein Objekt namens x aus einer Klasse "Fan" innerhalb der Hauptfenster-Datei QT GUI, wo ich es global sein möchte. Ich möchte, dass QTs Button-Slot-Funktionen Operationen auf dem Objekt ausführen können. Es tritt jedoch immer ein Compilerfehler "Fehler: C4430: fehlender Typspezifizierer - Int angenommen" auf. Hier ist die Header-Datei:Erstellen eines globalen Objekts in QT GUI

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private slots: 
    void on_btOn_clicked(); 

    void on_btOff_clicked(); 

private: 
    Ui::MainWindow *ui; 
    Fan x; // This doesn't work 
    Fan * x; // This doesn't either 
    int x; // This does work 
}; 

#endif // MAINWINDOW_H 

Und hier ist die CPP-Datei:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include "fan.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

} 
MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_btOn_clicked() 
{ 
    ui->lblState->setText("Fan is on"); 
} 

void MainWindow::on_btOff_clicked() 
{ 
    x.turnOff(); // This does not work of course 
    x->turnOff(); // Or this 
    ui->lblState->setText("Fan is off"); 
} 

Ich sagte bereits der CPP-Datei die Fan-Klasse von der fan.h Datei aufzunehmen. Wenn ich das Objekt innerhalb des Fensterkonstruktors erstelle, initialisiert es fein, ist aber nicht global. Außerdem gibt es keine zirkuläre Aufnahme von Header-Dateien. Fan-Klasse enthält kein Hauptfenster.

Vielleicht weiß ich nicht, wie ich danach suchen soll, aber ich habe bereits vergeblich nachgeforscht. Jede Hilfe wird geschätzt.

Edit: Hier ist die fan.cpp Datei

#include "fan.h" 

Fan::Fan(){ 
    speed = 0; 
    isOn = false; 
} 
void Fan::setSpeed(int s){ 
    speed = s; 
} 
int Fan::getSpeed(){ 
    return speed; 
} 
void Fan::turnOn(){ 
    isOn = true; 
    speed = 1; 
} 
void Fan::turnOff(){ 
    isOn = false; 
    speed = 0; 
} 
bool Fan::getState(){ 
    return isOn; 
} 

Und die fan.h Datei:

#ifndef FAN_H 
#define FAN_H 


class Fan 
{ 
private: 
    int speed; 
    bool isOn; 
public: 
    Fan(); 
    void setSpeed(int); 
    void turnOn(); 
    void turnOff(); 
    int getSpeed(); 
    bool getState(); 
}; 

#endif // FAN_H 
+1

Sie haben auch 'fan.h' im' mainwindow.h' weil 'Fan' Klasse in der beteiligt sich 'MainWindow' Klasse Deklaration. – vahancho

+0

Danke. Ich habe das gerade probiert, aber jetzt bekomme ich einen Fehler "nicht gelöstes externes Symbol" von den Funktionen on_btOn_clicked() und on_btOff_clicked() speziell in den Zeilen x.turnOn() und x.turnOff(). Warum ist das? –

+0

@AllanVindel, das anzeigt, dass Sie Ihre 'Fan' Klasse (.cpp) nicht kompiliert haben, oder' Fan :: turnOn() 'Funktion hat keine Definition. – vahancho

Antwort

1

Sie vergessen die Klasse Fan in Ihrem Header File aufzunehmen oder zu erklären. Wenn Sie

Fan * x; 

nutzen könnten Sie verwenden

class Fan; 

als Forward-Deklaration am Anfang Ihres Header File. Der Compiler muss nur wissen, dass es eine Klasse namens Fan gibt, aber innerhalb der Header verwenden Sie nur einen Zeiger. Achte nicht auf #include die echte Datei in deiner CPP-Datei.

Wenn Sie

Fan x; 

Sie müssen #include die Fan.h in Ihrem Header-File

+0

Danke. Ich habe die "fan.h" -Datei bereits in die Hauptfenster-Header-Datei eingefügt, und nun bekomme ich den Fehler "nicht aufgelöstes externes Symbol" von den Funktionen on_btOn_clicked() und on_btOff_clicked() speziell in den Zeilen x.turnOn() und x. abschalten(). Es scheint ein Schritt vorwärts zu sein. Irgendeine Idee warum das passiert? –

Verwandte Themen