Qt mit C++ mischen

Alles rund um die Programmierung mit Qt
Antworten
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

Qt mit C++ mischen

Beitrag 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
Gestern war heute noch morgen!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich wusste gar nicht das Qt was anderes als 'normales' C++ ist... :wink:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

C++ Code

Beitrag 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
Gestern war heute noch morgen!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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!
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

Fehler C++ - Qt

Beitrag 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
Gestern war heute noch morgen!
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag 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.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

Projekt

Beitrag 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
Gestern war heute noch morgen!
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Das ist kein Compilerfehler sondern ein Linkerfehler. Du hast vermutlich vergessen gegen die ws2_32.lib zu linken.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

Fehler

Beitrag 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
Gestern war heute noch morgen!
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Du verwendest also MinGW?

Wie sieht der Linker- und Compileraufruf aus?
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

Aufruf

Beitrag 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
Gestern war heute noch morgen!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

!!!

Beitrag 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
Gestern war heute noch morgen!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten