Seite 1 von 1

Qt mit C++ mischen

Verfasst: 11. November 2008 17:31
von Gapa
Hallo,

ich wollte fragen ob es denn irgendwie möglich ist, "normalen" C++ - Code zusammen mit Qt - Code in einer Datei zu haben, denn mein Compiler gibt bis jetzt immer Fehlermeldungen aus, und es kann doch nicht sein, dass ich nun all mein c++ - Wissen erst auf Qt übertragen muss, oder??

Grüße
Gapa

Verfasst: 11. November 2008 17:56
von Christian81
Ich wusste gar nicht das Qt was anderes als 'normales' C++ ist... :wink:

C++ Code

Verfasst: 11. November 2008 18:13
von Gapa
Hallo,

ja es ist mir schon klar, dass aus meinen Qt4 - Befehlen nachher C++ - Code wird, aber dennoch ist es mir ohne weiteres nicht möglich, eine einfache Integer-Variable in die main-Funktion zu packen, denn irgendwie hat sich Qt die main-Funktion für sich gekrallt:
C:\***\Datei.cpp In function `int qMain(int, char**)':
70 C:\***\Datei.cpp [Warning] unused variable 'i'
Qt beansprucht die main-Funktion für sich (die heißt jetzt qMain!!)...

Und wenn ich meine Headerdateien ins Projekt miteinbinde, indenen logischerweise C++-Standartcode steht, so bekomme ich tausende von Fehlermeldungen...wie kann ich das beheben??

Grüße
Gapa

Verfasst: 11. November 2008 18:48
von solarix
Es wird nicht "aus Qt4-Befehlen nachher C++ Code"! Qt _ist_ C++!
Qt beansprucht die main-Funktion für sich (die heißt jetzt qMain!!)...
Wer behauptet sowas? wo bitte in http://doc.trolltech.com/4.3/tutorial-t1.html hats ein "qMain"?
indenen logischerweise C++-Standartcode steht, so bekomme ich tausende von Fehlermeldungen...wie kann ich das beheben??
Ich habe sowohl C also auch C++ -Header in meinen Qt-Projekten... zeig mal her dein "Standard-Code"... gleich zusammen mit den Fehlermeldungen!

Fehler C++ - Qt

Verfasst: 11. November 2008 19:17
von Gapa
Hallo,
Wer behauptet sowas? wo bitte in http://doc.trolltech.com/4.3/tutorial-t1.html hats ein "qMain"?
Vielleicht liest du nächstes mal zuerst die Posts deutlicher bevor du wild drauf los schreibst!

Diese Fehlermeldung brachte mir mein Kompiler:
C:\***\Datei.cpp In function `int qMain(int, char**)':
70 C:\***\Datei.cpp [Warning] unused variable 'i'
Also mein Kompiler behauptet das!!!
Ich habe sowohl C also auch C++ -Header in meinen Qt-Projekten... zeig mal her dein "Standard-Code"... gleich zusammen mit den Fehlermeldungen!
Hier der Aufbau meines Projekts:

-Projekt: Server.dev
> Server.cpp
> Gui.h
> Connection.h
> Strings.h
> File.h

Server.cpp:

Code: Alles auswählen

//Server.cpp

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef SERVER_CPP
#define SERVER_CPP

#include <iostream>
#include "Gui.h"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Widget_Server_Load::Widget_Server_Load()
{
  vbl_main = new QVBoxLayout(this);
  gl_address = new QGridLayout;
  hbl_security = new QHBoxLayout;
  
  gb_address = new QGroupBox("Adresse");
  gb_security = new QGroupBox("Sicherheit");

  l_port = new QLabel("Port: ");
  l_clients_max = new QLabel("Maximale Benutzerzahl: ");
  l_mode = new QLabel("Modus: ");
  l_password = new QLabel("Passwort: ");

  le_port = new QLineEdit;
  le_clients_max = new QLineEdit;
  le_mode = new QLineEdit;
  le_password = new QLineEdit;
  
  le_password->setEchoMode(QLineEdit::Password);

  pb_load = new QPushButton("Hochladen");
  
  gl_address->addWidget(l_port, 0, 0, 1, 1);
  gl_address->addWidget(l_clients_max, 1, 0, 1, 1);
  gl_address->addWidget(l_mode, 2, 0, 1, 1);
  gl_address->addWidget(le_port, 0, 2, 1, 1);
  gl_address->addWidget(le_clients_max, 1, 2, 1, 1);
  gl_address->addWidget(le_mode, 2, 2, 1, 1);

  hbl_security->addWidget(l_password);
  hbl_security->addWidget(le_password);
  
  gb_address->setLayout(gl_address);
  gb_security->setLayout(hbl_security);
  
  vbl_main->addWidget(gb_address);
  vbl_main->addWidget(gb_security);
  vbl_main->addWidget(pb_load);
  
  connect(pb_load, SIGNAL( clicked() ), this, SLOT( Load() ) );
  setWindowTitle("Server hochfahren");
}

Widget_Server_Load::~Widget_Server_Load()
{
}

void Widget_Server_Load::Load()
{
  QMessageBox::information(this, "TestNachricht", le_port->text(), QMessageBox::Ok);
}

int main(int argc, char *argv[]) // 0 = True | 1 = False
{
  QApplication a_server(argc, argv);
  Widget_Server_Load *w_s = new Widget_Server_Load();
  w_s->show();
 return a_server.exec();
}

#endif
Gui.h

Code: Alles auswählen

//Gui.h

#ifndef GUI_H
#define GUI_H

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QMessageBox>

class Widget_Server_Load : public QWidget
{
  Q_OBJECT
  private:
    QVBoxLayout *vbl_main;
    QGridLayout *gl_address;
    QHBoxLayout *hbl_security;
    QGroupBox *gb_address, *gb_security;
    QLabel *l_port, *l_clients_max, *l_mode, *l_password;
    QLineEdit *le_port, *le_clients_max, *le_mode, *le_password;
    QPushButton *pb_load;

  public:
    Widget_Server_Load();
    ~Widget_Server_Load();

  public slots:
    void Load();
};

#endif

Soweit funktioniert das Projekt.
Wenn ich aber nun eine "normale" Header-Datei hinzufüge, so beschwert er sich:

File.h

Code: Alles auswählen

//File.h

#ifndef FILE_H
#define FILE_H

#include <fstream>

using namespace std;

struct FileClient
{
  char bnme[30];
  char pswd[20];
};

bool File_String_Exist(FileClient str, int mode); // 0 = True | 1 = False
bool File_String_Write(FileClient str); // 0 = True | 1 = False

bool File_String_Exist(FileClient str, int mode) // int mode == 1 -> Username & Password | int mode == 2 -> Username
{
  ifstream file;
  char string_1[50], string_2[50];

  memset(&string_1, 0, sizeof(string_1));
  memset(&string_2, 0, sizeof(string_2));

  if(mode == 1)
  {
    strncpy(string_1, str.bnme, strlen(str.bnme));
    strncat(string_1, "|", strlen("|"));
    strncat(string_1, str.pswd, strlen(str.pswd));
  }
  else if(mode == 2)
    strncpy(string_1, str.bnme, strlen(str.bnme));

  string_1[strlen(string_1) + 1] = '\0';
  
  file.open("Users.txt");
  while(!file.eof())
  {
    file.getline(string_2, 50, '\n');
    string_2[strlen(string_2) + 1] = '\0';
    if(strncmp(string_1, string_2, strlen(string_1)) == 0)
     return 1;
  }
 return 0;
}
 
bool File_String_Write(FileClient str)
{
  ofstream file;
  char string[50];
  
  memset(&string, 0, sizeof(string));
  
  strncpy(string, str.bnme, strlen(str.bnme));
  strncat(string, "|", strlen("|"));
  strncat(string, str.pswd, strlen(str.pswd));
  
  file.open("Users.txt", ios::app);
  
  file << string << '\n';
 return 0;
}

#endif
Es kommen sofort unzählige Fehlermeldungen, welche ich jetzt nicht alle auflisten möchte...

Aber das schlimme ist, dass ich nicht einmal eine Intiger-Variable in der (q)-Main-Funktion erstellen kann, denn dann kommt sofort wieder obige Fehlermeldung!!
Erstelle ich sie jedoch außerhalb der (q)-Main-Funktion, so mekert er nicht!

Grüße
Gapa

Verfasst: 11. November 2008 19:36
von Volker
Irgendwie passt das nicht zusammen:
C:\***\Datei.cpp In function `int qMain(int, char**)':
70 C:\***\Datei.cpp [Warning] unused variable 'i'
Der Fehler verweist ja auf eine Datei "Datei.cpp" mit einer Funktion qMain (bzw. eigentlich ist es ja gar kein Fehler sondern nur ne Warnung.
Hier der Aufbau meines Projekts:

-Projekt: Server.dev
> Server.cpp
> Gui.h
> Connection.h
> Strings.h
> File.h
Hier ist nirgends eine Datei.cpp und der Code den du gepostet hast enthält auch nirgends eine qMain Funktion.
Hast Du in einem der Includes ein weiteres Include auf die Datei.cpp?

Und im Allgemeinen kann es Probleme geben, wenn man using namespace std in einer Header Datei verwendet. Man sollte das wenn dann nur in CPP Dateien nach allen Includes verwenden. Das muss kein Problem sein, aber kann.

Verfasst: 11. November 2008 19:48
von Christian81
Bis jetzt habe ich noch keinen Compilerfehler hier gesehen. Die Warnung in main() ist ne Warnung (hah wer hätte es gedacht).
Das dort qMain und nicht main steht muss niemanden beunruhigen.

Projekt

Verfasst: 11. November 2008 20:13
von Gapa
Hm... ok nochmal ganz von vorne:

Ich habe ein Projekt mit dem Namen Server.dev. Dieses Projekt beinhaltet 3 Dateien:
- Server.cpp (alias Datei.cpp ...wollte nur den Namen nicht mit angeben)
- Gui.h
- Connection.h

Ohne die Connection.h läuft das Projekt stabil, ohne Warnungen und normal.
Füge ich nun die Headerdatei Connection.h hinzu (die ist fehlerlos, denn ich habe sie ja bereits für viele Konsolenprogramme benutzt ohne Qt), so kommen Fehlermeldungen wie :
[Linker error] undefined reference to `WSAStartup@8'
[Linker error] undefined reference to `htons@4'
[Linker error] undefined reference to `inet_addr@4'
Diese Fehler müssten aber behoben sein, sobald ich unter Projekt-Optionen die winsock32.h den Parametern hinzufüge...
Die Includes stimmen auch alle!
Aber diese Fehler wollen einfach nicht weggehen!

Was mache ich falsch??

Grüße
Gapa

Verfasst: 11. November 2008 20:31
von Volker
Das ist kein Compilerfehler sondern ein Linkerfehler. Du hast vermutlich vergessen gegen die ws2_32.lib zu linken.

Fehler

Verfasst: 11. November 2008 20:52
von Gapa
Hallo,

ja ich weiß dass das ein Linker-Fehler ist, aber ich habe libwsock32.a sowie libws2_32.a hinzugelinkt!!

Die Fehlermeldungen bleiben die gleichen!
Was soll ich tun??

**EDIT**:

Ich habe spaßeshalber mal alle libs hinzugefügt, und der schei** Fehler kommt immer noch...ich hab jetzt keine libs mehr zum Einfügen!!!

Grüße
Gapa

Verfasst: 11. November 2008 20:58
von Volker
Du verwendest also MinGW?

Wie sieht der Linker- und Compileraufruf aus?

Aufruf

Verfasst: 11. November 2008 21:03
von Gapa
Ja verwende ich, wenn auch unfreiwillig^^ ...wobei ich für qmake immer den g++ - Compiler verwende.

Also zuerst erstelle ich immer (per qmake) das Projekt-File und dann das Make-File, und dann lass ich das Projekt von Dev-Cpp kompilieren bzw. linken.

Grüße
Gapa

Verfasst: 11. November 2008 21:08
von Christian81
Dann muss weder libwsock32.a sowie libws2_32.a irgendwo hin sondern
LIBS += ws2_32
ins pro-File
Oder besser gleich
QT += network

!!!

Verfasst: 11. November 2008 21:45
von Gapa
Ha!

Danke Chris!
Es funktioniert fast!

Ich kann nun fast alle Header-Dateien miteinbinden. Alle bis auf String.h.

Wenn ich String.h miteinbinde, kommen folgende Fehlermeldungen:
42 C:\Programme\CPP\Dev-Cpp\include\c++\3.4.2\cstring:51, from C:\Programme\CPP\Dev-Cpp\include\c++\3.4.2\mingw32\bits\c++locale.h In file included from C:/Programme/CPP/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/cstring:51, from C:/Programme/CPP/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/mingw32/bits/c++locale.h
46 C:\Programme\CPP\Dev-Cpp\include\c++\3.4.2\mingw32\bits\c++locale.h:42, from C:\Programme\CPP\Dev-Cpp\include\c++\3.4.2\iosfwd from C:/Programme/CPP/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/mingw32/bits/c++locale.h:42, from C:/Programme/CPP/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/iosfwd
44 C:\Programme\CPP\Dev-Cpp\include\c++\3.4.2\iosfwd:46, from C:\Programme\CPP\Dev-Cpp\include\c++\3.4.2\ios from C:/Programme/CPP/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/iosfwd:46, from C:/Programme/CPP/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/ios
45 C:\Programme\CPP\Dev-Cpp\include\c++\3.4.2\ios:44, from C:\Programme\CPP\Dev-Cpp\include\c++\3.4.2\ostream from C:/Programme/CPP/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/ios:44, from C:/Programme/CPP/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/ostream
...und so weiter...

Was hat denn das zu bedeuten??

Hier die String.h:

Code: Alles auswählen

//String.h

#ifndef STRING_H
#define STRING_H

struct ClientData
{
  char part_1[10000];
  char part_2[10000];
  char part_3[10000];
  char part_4[10000];
};

bool String_Compare_Part(char str1[1000], char str2[1000], int pos, int lengh); // 0 = True | 1 = False

char* String_Split(char str[1000], char ch[1], int ch_count); // char* string = True | 1 = False
char* String_Get_Part(char str[1000], int pos_1, int pos_2); // char* string = True | 1 = False
ClientData String_Get_ClientData(char str[1000]); // ClientData structure = True | 1 = False

int String_Get_Pos(char str[1000], char ch[1], int ch_count); // int pos = True | strlen(str) + 1 = False


bool String_Compare_Part(char str1[1000], char str2[1000], int pos, int lengh)
{
  for(int i = pos, ii = 0; i < (pos + lengh); i++)
  {
    ii++;
    if(str1[i] != str2[ii])
     return 0;
  }
 return 1;
}

char* String_Split(char str[1000], char ch[1], int ch_count)
{
}

char* String_Get_Part(char str[1000], int pos_1, int pos_2)
{
}

ClientData String_Get_ClientData(char str[1000])
{
  ClientData data;
  memset(&data, 0, sizeof(ClientData));
  
  for(int i = 0, ii = 0, iii = 0; i <= strlen(str); i++, iii++)
  {
    if(str[i] == '|')
    {
      i++;
      ii++;
      iii = 0;
    }
    
    switch(ii)
    {
      case 0:
        data.part_1[iii] = str[i];
       break;
      case 1:
        data.part_2[iii] = str[i];
       break;
      case 2:
        data.part_3[iii] = str[i];
       break;
      case 3:
        data.part_4[iii] = str[i];
       break;
    }
  }
  data.part_1[strlen(data.part_1) + 1] = '\0';
  data.part_2[strlen(data.part_2) + 1] = '\0';
  data.part_3[strlen(data.part_3) + 1] = '\0';
  data.part_4[strlen(data.part_4) + 1] = '\0';
 return data;
}

int String_Get_Pos(char str[1000], char ch[1], int ch_count)
{
  for(int i = 0, ii = 0; i <= strlen(str); i++)
  {
    if(str[i] == ch[0])
     ii++;
    
    if(ii == ch_count)
   return i;
  }
 return (strlen(str) + 1);
}

#endif
Hoffe auf eine Antwort hierauf.

Grüße
Gapa

Verfasst: 11. November 2008 21:47
von Christian81
Ich weiß zwar nicht was das mit Qt zu tun haben sollte, aber string.h ist ein sehr schlechter Name - ein C-Systemheader heißt nämlich genauso.
Ich würde erstmal etwas besser C/C++ lernen - alle Fehler hier hatten nichts mit Qt zu tun...