Ik heb het volgende al geprobeerd:
globals.h:
#ifndef __GLOBALS_H__
#define __GLOBALS_H__
#include "configuration.h"
class Global {
public:
static Configuration * CONFIG;
};
#endif
globals.cpp:
#include "globals.h"
Global::CONFIG = new Configuration;
Maar dan krijg ik dezelfde fout.
Ik zou iets op bv. deze manier doen:
verandering aan configuration.h
void setName(const QString & name);
verandering aan configuration.cpp
void Configuration::setName(const QString & name) {
this->setName(name);
}
[ edit: ik zie nu pas dat deze functie setName() eigenlijk niet kan kloppen... je zal gewoon recursief iets blijven uitvoeren; ik had zelf ook een heap/stack foutje gemaakt in main.cpp hieronder, heb ik even aangepast ]globals.h
#ifndef __GLOBALS_H__
#define __GLOBALS_H__
//#include "configuration.h"
class Configuration;
class Global {
public:
Global();
~Global();
Configuration * config;
};
#endif // __GLOBALS_H__
globals.cpp
#include "globals.h"
#include "configuration.h"
Global::Global() {
config = new Configuration;
}
Global::~Global() {
delete config;
}
verandering aan main.cpp
void initialize(QWidget * win)
{
Global * global = new Global;
win->setMinimumSize(640,480);
QVBoxLayout *layout = new QVBoxLayout;
QTabWidget * tabbar = new QTabWidget;
layout->addWidget(tabbar);
MetaTab * meta = new MetaTab(0, &global);
tabbar->addTab(meta, QObject::tr("Meta"));
QWidget * prep = new QWidget;
tabbar->addTab(prep, QObject::tr("Prep Section"));
// etc...
verandering aan metatab.cpp
//valueChanged
connect(name, SIGNAL(textChanged(const QString &)), global->config, SLOT(setName(const QString &)));
Maar eigenlijk zit de code wat messy in elkaar. Ik zou eens een goed boek over C++ aanschaffen. Eentje die je ook 'design patterns' (ontwerppatronen) aanleert. Ook helpt het wel om de voorbeeldcode van bv. Qt 4 demos/examples te bekijken. Die zijn altijd heel netjes geprogrammeerd.
Voor de GUI zou je btw Designer kunnen gebruiken in plaats van het handmatig te hoeven doen.
Zodat je dit soort gekke dingen niet doet:
QScrollArea * scroller = new QScrollArea(this);
scroller->setWidget(this);
Bij mij gebruikt dit gewoon 100% CPU zonder iets nuttigs te doen.
* Ik heb hier 2 GB ram, ik merk dat dus nog eens niet . Ik heb proberen uit te zoeken hoe ik iets van een tekstbestand kan lezen, maar er is geen goede manier om dat cross-platform te doen. Op Mac OS X zou ik bv. het tekstbestand willen halen uit de map "Resources", terwijl in Linux ik het zou willen halen uit "$dataroot/syrpmbuild" (dataroot is meestal /usr/share, maar dit kan normaal gezien veranderd worden)
Als je op verschillende OS'en verschillende mappen wil gebruiken zou je platform defines kunnen gebruiken: Q_WS_X11 voor Linux, Q_WS_WIN voor Windows, Q_WS_MAC voor Mac (en Q_WS_QWS voor Qtopia Core) bv.:
#ifdef Q_WS_X11
resPath = "/usr/share/syrpmbuild/"
#else
resPath = "Resources/"
#endif
Een andere mogelijkheid is volgens mij om de static function QDir::setSearchPaths te gebruiken om in te stellen in welke mappen gezocht moet worden:
http://doc.trolltech.com/4.4/qdir.html#setSearchPaths* Worden die objecten niet automatisch vewijderd als je het programma afsluit?
Bij alle moderne besturingssystemen wel, maar dat is geen reden om niet netjes te programmeren
In het midden van een programma zou zoiets gemakkelijk kunnen uitmonden in de befaamde 'memleaks' of geheugenlekken. Eigenlijk geldt: voor elke "new" heb je een "delete" nodig op de gepaste plaats, maar bij Qt objecten volstaat het meestal als je bij het aanmaken van het object een parent meegeeft, wanneer die parent dan wordt gedeleted, worden ook automatisch alle 'child' objecten van die parent gedeleted.