Wie fügen Sie C++ – header-Datei Qt-Projekt mit dem Qt Creator

Möchte ich entwickeln eine kleine Qt-Widget-Anwendung, die Daten bekommt, die für die Auswertung aus einer MySQL-Datenbank. Ich habe einige der Funktionen, die ich verwenden möchte in eine C++ header Datei, die ich schrieb, für einen älteren C++ – Projekt. Ich möchte, um die Verwendung der Funktionen in diesem header-Datei, aber ich Schaffe es nicht dieses add header richtig, um mein Qt Projekt.

In Qt Creator, ich habe das „Add existing Files“ – dialog fügen Sie die header-Datei und ich habe auch gesagt, der Qt Creator zu verwenden, der MySQL_connector C++ – Bibliothek, die verwendet wird, in meine header-Datei. Die .pro-Datei sieht jetzt wie folgt aus:

#-------------------------------------------------
#
# Project created by QtCreator 2016-03-31T14:12:08
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = dummy
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    Level2Snapshot.cpp

HEADERS  += mainwindow.h \
    Level2Snapshot.h \
    MySQL_Operations.h

FORMS    += mainwindow.ui

unix:!macx: LIBS += -L$$PWD/../../../../usr/lib/ -lmysqlcppconn

INCLUDEPATH += $$PWD/../../../../usr/include
DEPENDPATH += $$PWD/../../../../usr/include

Jetzt, wenn ich Sie initialisieren möchten, notwendig, sql-Objekte in meinem MainWindow-source-Datei, bekomme ich „nicht deklariert“ Fehler während der Kompilierung.

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


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    sql::Driver *driver;
    sql::Connection *con;
}

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

Ich es Arbeit bilden könnte, indem auch mein „MySQL_Operations.h“, die enthält alle MySQL-bezogene Dinge, die in der Quell-Datei:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "MySQL_Operations.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    sql::Driver *driver;
    sql::Connection *con;
}

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

Aber, dass nicht mir helfen, weil ich brauche, to include die header-Datei in meinem MainWindow.h weil ich will erklären Methoden gibt es, die nehmen die MySQL-Verbindung als argument. Solche wie dieses zum Beispiel:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "MySQL_Operations.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void print_time_span(sql::Connection *con, std::string database, std::string table);

private:
    Ui::MainWindow *ui;
};

#endif //MAINWINDOW_H

Tun, bekomme ich auch „multiple definition“ – Fehler für alle Funktionen, die implementiert werden, in MySQL_Operations.h. Ich bin mir bewusst dass ähnliche Fragen gestellt zu haben, auf die mehrere-definition-Problem, aber nichts hat mir geholfen. offensichtlich ist der compiler von den Inhalten Kenntnis hat meine header-Datei, weil sonst verstehe ich nicht, wie es klagt über mehrere Definitionen. Aber nicht explizit hinzufügen MySQL_Operations.h ein #include-Anweisung, aber nur zu dem .pro-Datei, wie es zu sein scheint, erfolgt in Qt-Projekte, die erstellt werden, mit Qt Creator , funktioniert nicht.

Ich lege viel Mühe in die MySQL-Zeug, das ist in meiner header-Datei, und ich möchte wirklich, um das zu verwenden, statt den MySQL-tools, die Qt bietet. Also jede Hilfe ist sehr geschätzt. Ich bin neu in Qt und vielleicht nicht bewusst sein, einige wesentliche Punkte über den build-Prozess. Also zögern Sie nicht, werfen selbst die einfachsten Ratschläge an mich.

Vielen Dank!
Niels

Danke für die Antworten so weit. Ich habe den header auf ein minimum und es noch reproduziert den Fehler. Hier ist die Datei:

#ifndef MYSQL_OPERATIONS_H
#define MYSQL_OPERATIONS_H

#include "mysql_connection.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
#include <vector>

namespace dom{


    void print_time_span(sql::Connection *con, std::string database, std::string table){
        sql::Statement *stmt;
        sql::ResultSet *res;

        std::string use_database = "USE " + database;

        stmt = con->createStatement();
        stmt->execute(use_database);

        res = stmt->executeQuery("SELECT MAX(Time) AS Time FROM test");
        res->next();   

        std::string endtime = res->getString("Time");

        res = stmt->executeQuery("SELECT MIN(Time) AS Time FROM test");
        res->next();   

        std::string starttime = res->getString("Time");
        std::cout << "First entry in " <<
                database <<
                "." <<
                table << 
                " is from " << starttime << 
                " and ranges to " << 
                endtime << "." << std::endl;


        delete res;
        delete stmt;
    }

}
#endif /* MYSQL_OPERATIONS_H */

Ist es nur eine einfache Abfrage. Die Fehler, die ich bekomme, wenn hinzufügen, wenn Sie einschließlich der header-Datei in das Hauptfenster.h:

/home/niels/Programmierung/dummy/MySQL_Operations.h:28: Fehler: multiple definition of `dom::print_time_span(sql::Connection*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'

Und ich bekomme diese Fehlermeldung zweimal.

  • Könnten Sie zeigen die header-Datei, sowie die Fehler? Auch, haben Sie erneut qmake (Die Build -> Run qmake option im Qt-Creator) und baute das Projekt?
  • Und was machst du in deiner "MySQL_Operations.h" header-Datei? Wie viele Definitionen wollen Sie bekommen? Und hat es include-guards?
  • Auch, Sie sollten nicht zu #include die Datei in mainwindow.cpp wenn Sie bereits eingeschlossen in mainwindow.h, da mainwindow.h ist enthalten in mainwindow.cpp.
  • Dies ist nicht wirklich spezifisch für qt, alle header-Dateien sollten Wachen. #ifndef MYHEADERFILE #define MYHEADERFILE Zeug …#endif, Das klingt wie dein Problem.
  • Haben Sie ein QMake??? 99% der Zeit Fragen die Leute Sachen wie diese, die Sie nur havent run QMake
  • Sie können auch vorwärts-Deklaration für Klassen müssen Sie im Kopfbereich..
  • vielen Dank für die lobt. Ich fügte hinzu, die header-Datei und die Ausgabe des Fehlers auf meine Frage.
  • und AngryDuck, ja das habe ich run qmake.

InformationsquelleAutor Niels | 2016-03-31

 

One Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.