Qt: Problem mit static Properties

  • C++

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Qt: Problem mit static Properties

    Hallo,
    ich habe mich gestern mal wieder mit Qt beschäftigt, und stehe grade vor einem wahrscheinlich recht simplen und stupiden Problem.
    Das ist ist der Inhalt meiner .h Datei:

    C-Quellcode

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include <QMainWindow>
    4. #include <QString>
    5. #include <QtGui>
    6. #include <QtCore>
    7. namespace Ui {
    8. class MainWindow;
    9. }
    10. class MainWindow : public QMainWindow
    11. {
    12. Q_OBJECT
    13. public:
    14. explicit MainWindow(QWidget *parent = 0);
    15. ~MainWindow();
    16. static QWidget* CurrentTab();
    17. static int* activeWindow(void) { return activeWindowInternal; }
    18. static void setactiveWindow(int* value) { activeWindowInternal = value; }
    19. private:
    20. static int* activeWindowInternal;
    21. Ui::MainWindow *ui;
    22. };
    23. #endif // MAINWINDOW_H


    Und das hier der relevante Code der dazugehörigen .cpp Datei:

    C-Quellcode

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include <QAction>
    4. #include <QApplication>
    5. #include <QCloseEvent>
    6. #include <QFile>
    7. #include <QFileInfo>
    8. #include <QFileDialog>
    9. #include <QIcon>
    10. #include <QMenu>
    11. #include <QMenuBar>
    12. #include <QMessageBox>
    13. #include <QPoint>
    14. #include <QSettings>
    15. #include <QSize>
    16. #include <QStatusBar>
    17. #include <QTextStream>
    18. #include <QToolBar>
    19. MainWindow::MainWindow(QWidget *parent) :
    20. QMainWindow(parent),
    21. ui(new Ui::MainWindow)
    22. {
    23. // MainWindow();
    24. ui->setupUi(this);
    25. }
    26. MainWindow::~MainWindow()
    27. {
    28. delete ui;
    29. }
    30. QWidget* MainWindow::CurrentTab()
    31. {
    32. if (0 != NULL)
    33. {
    34. int* test= MainWindow::activeWindow();
    35. }
    36. else
    37. {
    38. return NULL;
    39. }
    40. }


    Wenn ich das Projekt erstellen will, wird mir folgender Fehler ausgegeben:
    mainwindow.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""private: static int * MainWindow::activeWindowInternal" (?activeWindowInternal@MainWindow@@0PAHA)" in Funktion ""public: static int * __cdecl MainWindow::activeWindow(void)" (?activeWindow@MainWindow@@SAPAHXZ)".
    release\application.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.


    Jetzt frage ich mich, woran das liegt, bzw. wie man das lösen kann...
    Über Hilfe wäre ich sehr dankbar, da ich grade echt auf'm Schlauch stehe;)
    Die static-Variable wird von dir nur deklariert. Ähnlich wie static-Funktionen musst du sie selber noch einmal in einer .cpp-Datei definieren.
    Das ist die logische Konsequenz dafür, dass du kein Object von MainWindow erzeugen musst, damit activeWindowInternal verfügbar ist. Ergo kann der Compiler nicht wissen, woher er den Speicherplatz für die deklarierte Variable nehmen soll.


    Deshalb definieren: (wichtig: muss in der .cpp-Datei sein)

    C-Quellcode

    1. int *MainWindow::activeWindowInternal = NULL;


    Noch eine Frage zum Code: woher kommt Ui::MainWindow? Warum nennst du zwei verschiedene Klassen in einem Projekt mit einem so essentiellen und vertauschbaren Namen gleich?
    Warum arbeitest du mit new und nicht mit RAII?
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Chrisber“ ()

    Chrisber schrieb:

    Noch eine Frage zum Code: woher kommt Ui::MainWindow? Warum nennst du zwei verschiedene Klassen in einem Projekt mit einem so essentiellen und vertauschbaren Namen gleich?
    Das kommt von Qt und seinem sehr merkwürdigen Designer.
    Die Klasse UI definiert das User-Interface der Form, dort steht in etwa das, was in .NET in der InitializeComponent() steht, in Qt ist es aber in eine separate Klasse gekapselt, die denselben Namen im NameSpace UI hat.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!