Ich arbeite mit QT 5.10.0 auf einem Windows 10 PC und nutzen den MinGW und den MSVC-Compiler von Visual Studio 2017. Die Oberfläche erstelle ich in QT-Creator. Das "Problem" äußert sich wie folgt:
Ich habe eine Starterklasse mit einem Hauptfenster, das nur 4 Buttons enthält und die jeweiligen Teilanwendungen startet. Der prinzipielle Aufbau sieht so aus. Ich habe es so reduziert, dass nur noch die relevanten Teile in den Klassen stehen:
starter.h:
Code: Alles auswählen
#ifndef STARTER_H
#define STARTER_H
#include <QMainWindow>
#include <QDebug>
#include <QRegExp>
#include <QChar>
#include <QPlainTextEdit>
#include "config.h"
namespace Ui {
class Starter;
}
class Starter : public QMainWindow
{
Q_OBJECT
public:
explicit Starter(QWidget *parent = 0);
~Starter();
public slots:
private slots:
void onBtnConfigClicked();
void onBtnEndClicked();
private:
Ui::Starter *ui;
Config *configDialog;
};
#endif //STARTER_H
starter.cpp
Code: Alles auswählen
#include "starter.h"
#include "ui_starter.h"
Starter::Starter(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Starter)
{
ui->setupUi(this);
connect(ui->btnConfig, SIGNAL(clicked()), this, SLOT(onBtnConfigClicked()));
connect(ui->btnEnd, SIGNAL(clicked(bool)), this, SLOT(onBtnEndClicked()));
configDialog = new Config(this);
}
void Starter::onBtnConfigClicked()
{
configDialog->show();
}
void Starter::onBtnEndClicked()
{
qApp->quit();
}
Starter::~Starter()
{
delete configDialog;
delete ui;
}
Code: Alles auswählen
#ifndef CONFIG_H
#define CONFIG_H
#include <QDialog>
#include <QString>
#include "starter.h"
namespace Ui {
class Config;
}
class Config : public QDialog
{
Q_OBJECT
public:
explicit Config(QWidget *parent = 0);
~Config();
private slots:
void on_btnEnd_clicked();
private:
Ui::Config *ui;
//Starter *starter;
};
#endif // CONFIG_H
config.c
Code: Alles auswählen
#include "config.h"
#include "ui_config.h"
Config::Config(QWidget *parent) :
QDialog(parent),
ui(new Ui::Config)
{
ui->setupUi(this);
connect(ui->btnEnd, SIGNAL(pressed()), this, SLOT(on_btnEnd_clicked()));
}
void Config::on_btnEnd_clicked()
{
this->close();
}
Config::~Config()
{
delete ui;
}
Aus der Config-Klasse möchte ich dann auf Elemente der Starter-Klasse zugreifen und deshalb habe ich den Include auf starter.h hinzugefügt und eine Zeigervariable vom Typ Starter erzeugt. Diese wollte ich dann dem parent-Instanz zuweisen (aber so weit komme ich gar nicht). Beim Compilieren erhielt ich mit MinGW die Fehlermeldung:
C:\Users\werner\Documents\QT-Projekte\TestReader\config.h:26: Fehler: 'Starter' does not name a type
Starter *starter;
^
Der Editor erkennt die Klasse allerdings, wenn ich die Variable so erzeugt habe, zeigt mit die Autovervollständigung z. B. Methoden der Klasse an.
Daraufhin habe ich die Zeile auskommentiert, erhalte aber immer noch einen Fehler:
C:\Users\werner\Documents\QT-Projekte\TestReader\starter.h:31: Fehler: 'Config' does not name a type
Config *configDialog;
^
Ich vermute, dass es mit dem zirkulären Verweis zu tun hat, denn ich binde in starter.h ja config.h ein und in config.h starter.h. Allerdings müsste die Define-Direktive doch ein doppeltes Einbinden verhindern, oder? Ich habe es auch schon mit #pragma once probiert, aber das Ergebnis bleibt gleich. Beim Compilieren mit MSVC erhalte ich noch weitere Syntaxfehler. Aus Platzgründen lasse ich die hier erstmal weg. Vielleicht seht Ihr ja ohnehin schon den Fehler.
Und eine Bitte: ich wollte den Aufbau eh ganz anders gestalten, um auf diese gegenseitigen Verweise verzichten zu können. Es geht mir aber um das grundlegende Verständnis, wodurch diese Fehlermeldung erzeugt wird.
Ohne Fehler funktioniert das Ganze (in beiden Compilern), wenn ich in den Include (starter.h) in config.cpp einfüge, dort außerhalb der Klassendeklaration die Zeigervariable erzeuge:
Code: Alles auswählen
#include "config.h"
#include "ui_config.h"
#include "starter.h"
Starter *starter;
Config::Config(QWidget *parent) :
QDialog(parent),
ui(new Ui::Config)
{
ui->setupUi(this);
starter = (Starter*) parent;
connect(ui->btnEnd, SIGNAL(pressed()), this, SLOT(on_btnEnd_clicked()));
}
void Config::on_btnEnd_clicked()
{
this->close();
}
Config::~Config()
{
delete ui;
}
Ich würde mich über Eure Anregungen sehr freuen und wünsche Euch allen schon einmal einen guten Rutsch in ein möglichst bugfreies Jahr 2018!