[solved] QHash's insert() wrong use? --> VS-Debugger showed botch data due to missing Qt-Addon for VS



  • Hello peoplez,

    I have a beginner problem with my QHash @QHash<pi_int32, SpecialObject> myQHash;@

    I built a controller, which handles my QHash. This Controller has got a method:
    @void DataController::addNewData(qint32 tID, QString tName, qint32 tCat, qint32 tCon)
    {
    SpecialObject tPI (tID, tName, tCat, tCon); // tPI is set correctly
    this->myQHash.insert(tID, tPI); // wrong values inserted into myQHash
    }
    @

    The object tPI is correctly; all its attributes are correctly set.

    The error is in the next line, where the key-SpecialObject-value pair (tID, tPI) should be inserted to myQHash. It is not real error, but rather an incorrect insertion.

    For testing purposes, I have elsewhere:
    @pDataController.addNewData(2511, tr("Home"), 20481, 1272923);@

    But according to my debugger following values are stored
    (1, BadPtr, 262148, 17) instead of
    (2511, tr("Home"), 20481, 1272923)

    Does anybody know which mistake I have done? I am thankful for any advise.

    Cheers Huck



  • !http://img232.imageshack.us/img232/154/forum120.jpg(Here is an screenshot of that debugger output.)!

    As I said, Its no real error, the application does not terminate or interrupt.


  • Moderators

    SpecialObject goes out of scope right after you insert it into your hash. Afterwards its contents is undefined.



  • You have to create your SpecialObject on the heap, because this way it gets deleted after you leave the addNewData function.

    @

    QHash<pi_int32, SpecialObject*> myQHash;
    @

    @
    void DataController::addNewData(qint32 tID, QString tName, qint32 tCat, qint32 tCon)
    {
    SpecialObject *tPI = new SpecialObject(tID, tName, tCat, tCon);
    this->myQHash.insert(tID, tPI);
    }
    @



  • Ok, and as far as I know every with new created pointer should be deleted by programmer later on.

    @
    void DataController::addNewData(qint32 tID, QString tName, qint32 tCat, qint32 tCon) {
    SpecialObject *tPI = new SpecialObject(tID, tName, tCat, tCon);
    this->myQHash.insert(tID, tPI);
    delete tPI;
    }
    @

    does not make any sence right? Shall I delete all those SpecialObjects pointers in the destructor later? How would you handle that?



  • A bit difficult to give advice with so little information. If SpecialObject is a small class, and it makes sense to pass SpecialObject objects around by value, then the code you have written should be OK. If not, then you must create the objects on the heap, using new, and then delete them when you no longer need them, e.g. when/before the QHash is destroyed.



  • Looks to me like you have not properly implemented the assignment and/or copy constructor of your SpecialObject class properly.

    @Hunger I thought QHash took a copy of objects when you insert them rather than using a reference to them as you are implying?



  • @ludde: Yes at that moment SpecialObject has got one QString and 5 qint32 attributes.
    However, this is going to be developed and thus rising.

    @ZapB: Thatswhy I wrote an own class for it, I know that I need special format for output purposes late on. And thatswhy I haven't take "struct".

    Anyway, creating my object on the heap does not solve my problem either. During debugging I can see botch values in pDataController as on the screenshot above. And same CXX0030 error.



  • [quote author="ZapB" date="1309781440"]Looks to me like you have not properly implemented the assignment and/or copy constructor of your SpecialObject class properly.

    @Hunger I thought QHash took a copy of objects when you insert them rather than using a reference to them as you are implying?[/quote]

    Correct!

    bq. To quote from the "docs about container classes":http://doc.qt.nokia.com/4.7/containers.html
    The values stored in the various containers can be of any assignable data type. To qualify, a type must provide a default constructor, a copy constructor, and an assignment operator. This covers most data types you are likely to want to store in a container, including basic types such as int and double, pointer types, and Qt data types such as QString, QDate, and QTime, but it doesn't cover QObject or any QObject subclass (QWidget, QDialog, QTimer, etc.). If you attempt to instantiate a QList<QWidget>, the compiler will complain that QWidget's copy constructor and assignment operators are disabled. If you want to store these kinds of objects in a container, store them as pointers, for example as QList<QWidget *>.

    And more important:

    bq. If we don't provide a copy constructor or an assignment operator, C++ provides a default implementation that performs a member-by-member copy.

    Theses autogenerated operators and constructors are most likely not sufficient!



  • Have you unit tested you SpecialObject class to ensure that it works properly for common operations (e.g. creation, destruction, assignment, copying, output)?

    Can you post the code for SpecialObject please?



  • I think you will have to show us the SpecialObject class, if you cannot figure out what's wrong with it from the help you've been given so far.



  • Even better, create a complete test case, consisting of just the class, a main method and a method that triggers the crash.



  • Here you have compileable but not yet linkable codes. LinkError see bottom.

    DataItem.cpp
    @#include "DataItem.h"
    #include <QString>
    DataItem::DataItem()
    {
    this->dataID = 0;
    this->dataCon = 0;
    this->dataCat = 0;
    this->dataName = "defName";
    }

    DataItem::DataItem(qint32 tId, QString tName, qint32 tCat, qint32 tCon)
    {
    this->dataID = tId;
    this->dataCon = tCon;
    this->dataCat = tCat;
    this->dataName = tName;
    }

    qint32 DataItem::getID() const { return this->dataID; }

    QString DataItem::getName() const { return this->dataName; }

    qint32 DataItem::getCat() const { return this->dataCat; }

    qint32 DataItem::getCon() const { return this->dataCon; }

    DataItem::~DataItem(void) {}@

    DataItem.h
    @#pragma once

    #include <QString>

    class DataItem
    {
    public:
    DataItem();
    DataItem(qint32 tId, QString tName, qint32 tCat, qint32 tCon);
    ~DataItem(void);

    qint32 getID() const;
    QString getName() const;
    qint32 getCat() const;
    qint32 getCon() const;

    private:
    qint32 dataID;
    QString dataName;
    qint32 dataCat;
    qint32 dataCon;
    };@

    DataController.cpp
    @#include <QHash>
    #include "DataController.h"
    #include "DataItem.h"

    //DataController::DataController(void)
    //{
    //
    //}

    //void DataController::addNew(DataItem * tPI) { this->myQHash.insert(tPI->getID(), *tPI); }

    void DataController::addNew(qint32 tID, QString tName, qint32 tCat, qint32 tCon)
    {
    //DataItem tPI (tID, tName, tCat, tCon);
    DataItem * tPI = new DataItem(tID, tName, tCat, tCon);
    this->myQHash.insert(tID, tPI);
    }

    DataController::~DataController(void) {}@

    DataController.h
    @
    #pragma once

    #include <QString>
    #include <QHash>
    #include "DataItem.h"

    class DataController
    {
    public:
    //DataController(void);
    ~DataController(void);
    //void addNew(DataItem * tPI);
    void addNew(qint32, QString, qint32, qint32);

    private:
    QHash<qint32, DataItem*> myQHash;
    };@

    MyDockWidget.cpp
    @#include "MyDockWidget.h"
    #include "DataController.h"
    #include <QString>
    MyDockWidget::MyDockWidget( )
    {
    //DataController myDataController;
    }

    int MyDockWidget::main(int p_argsc, char *p_argsv[] )
    {
    //this->myDataController = new DataController();
    myDataController.addNew(2511, "Heim", 20481, 1272923);
    myDataController.addNew(2512, "Work", 20482, 1272963);
    // Breakpoint here

    return 1;
    

    }
    @

    MyDockWidget.h
    @#ifndef MY_DOCK_WIDGET_H
    #define My_DOCK_WIDGET_H
    #include <QString>
    #include "DataController.h"

    class MyDockWidget
    {
    //Q_OBJECT

    public:
        /// @brief constructor
        MyDockWidget();
    
        DataController myDataController;
    

    int main( int p_argsc, char *p_argsv[] );
    };
    #endif // MY_DOCK_WIDGET_H
    @

    I now get a Linker-Error:
    1>Linking...
    1>DataItem.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QString::~QString(void)" (_imp??1QString@@QAE@XZ) referenced in function __unwindfunclet$??0DataItem@@QAE@XZ$0

    but I did not use any Libs or Dlls??! How is that be?



  • Yes you are. You are using the QtCore dll. Also where is your main() function?



  • You are missing the linker options in your pro file.
    can you show it to us?
    or what do you use for compiling?

    For me, your code compiles fine.



  • Code looks OK to me. Except your DataController destructor should probably destroy the DataItems. But the way your DataItems are now, you should be able to pass them around by value, i.e. not bother with new/delete and the use of pointers.



  • @Gerolf: Yes the compilation is not my problem ;) My linker will not link my stuff ;)

    @ZapB: Ok, I included the %QTDIR%qt4.5.0libQtCore4.lib to
    Project --> Properties --> Linker --> General --> Add additional Libraries. But same linker error as above.

    bq. 1>Linking...
    1>DataItem.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QString::~QString(void)" (_imp??1QString@@QAE@XZ) referenced in function __unwindfunclet$??0DataItem@@QAE@XZ$0
    1>DataController.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall QString::~QString(void)" (_imp??1QString@@QAE@XZ)
    ////etc....
    1>deldel3 - 19 error(s), 0 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

    Qstring is in QtCore as well as far as I know?

    The main? Is that wrong?



  • @ludde: Yes of course. I will destroy all DataItems pointers objects which are stored in my heap after all.
    But therefore I have to store them first, which was my initial problem. Now, my smaller problem is to make that app run ;)



  • I could not see a main() function in what you posted.



  • The main function is inside the MyDockWidget class - looks really weird to me... Does the main function not have to be global?

    Regarding the link errors, which IDE are you using to build your project?



  • ah ok. without MyDockWidget:: in front?

    just:
    @int main(int p_argsc, char *p_argsv[] ) {
    myDataController.addNew(2511, "Heim", 20481, 1272923);
    myDataController.addNew(2512, "Work", 20482, 1272963);
    // Breakpoint here
    return 1;
    }
    @



  • Yeah, but then you cannot use myDataController, you have to create it first.
    And remove the declaration of main() in the .h file.



  • [quote author="ludde" date="1309856111"]Regarding the link errors, which IDE are you using to build your project?[/quote]
    Visual Studio 2008 Version 9



  • [quote author="ludde" date="1309856111"]The main function is inside the MyDockWidget class - looks really weird to me... Does the main function not have to be global?[/quote]

    This project is in real a *.dll. I just extracted the required methods and classes to reproduce my QHash problem.

    Hint: The original projects were generated by cmake, which should add corresponding libs correctly.



  • huckfinn,

    are you using MSDEV for building?
    If yes, please post your vcproj file via pastebin ort similar shares. I'm sure, the problem is located there.



  • Here is my vproj file:

    @
    <?xml version="1.0" encoding="Windows-1252"?>
    <VisualStudioProject
    ProjectType="Visual C++"
    Version="9,00"
    Name="deldel3"
    ProjectGUID="{19DD986F-AEBE-4C05-8309-B174DE1C1C3F}"
    RootNamespace="deldel3"
    TargetFrameworkVersion="196613"

    <Platforms>
    <Platform
    Name="Win32"
    />
    </Platforms>
    <ToolFiles>
    </ToolFiles>
    <Configurations>
    <Configuration
    Name="Debug|Win32"
    OutputDirectory="$(SolutionDir)$(ConfigurationName)"
    IntermediateDirectory="$(ConfigurationName)"
    ConfigurationType="1"
    UseOfMFC="0"
    CharacterSet="2"

    <Tool
    Name="VCPreBuildEventTool"
    />
    <Tool
    Name="VCCustomBuildTool"
    />
    <Tool
    Name="VCXMLDataGeneratorTool"
    />
    <Tool
    Name="VCWebServiceProxyGeneratorTool"
    />
    <Tool
    Name="VCMIDLTool"
    />
    <Tool
    Name="VCCLCompilerTool"
    Optimization="0"
    AdditionalIncludeDirectories=""C:\\Qt\\qt-win-opensource-src-4.5.0\\include\\QtGui";"C:\\Qt\\qt-win-opensource-src-4.5.0\\include\\QtCore";"C:\\Qt\\qt-win-opensource-src-4.5.0\\include""
    MinimalRebuild="true"
    BasicRuntimeChecks="3"
    RuntimeLibrary="2"
    WarningLevel="3"
    DebugInformationFormat="4"
    />
    <Tool
    Name="VCManagedResourceCompilerTool"
    />
    <Tool
    Name="VCResourceCompilerTool"
    />
    <Tool
    Name="VCPreLinkEventTool"
    />
    <Tool
    Name="VCLinkerTool"
    LinkLibraryDependencies="false"
    UseUnicodeResponseFiles="false"
    AdditionalLibraryDirectories=""C:\\Qt\\qt-win-opensource-src-4.5.0\\lib\\QtCored4.lib";"C:\\Qt\\qt-win-opensource-src-4.5.0\\lib\\QtCore4.lib""
    GenerateDebugInformation="true"
    EntryPointSymbol="main"
    TargetMachine="1"
    />
    <Tool
    Name="VCALinkTool"
    />
    <Tool
    Name="VCManifestTool"
    />
    <Tool
    Name="VCXDCMakeTool"
    />
    <Tool
    Name="VCBscMakeTool"
    />
    <Tool
    Name="VCFxCopTool"
    />
    <Tool
    Name="VCAppVerifierTool"
    />
    <Tool
    Name="VCPostBuildEventTool"
    />
    </Configuration>
    <Configuration
    Name="Release|Win32"
    OutputDirectory="$(SolutionDir)$(ConfigurationName)"
    IntermediateDirectory="$(ConfigurationName)"
    ConfigurationType="1"
    CharacterSet="2"
    WholeProgramOptimization="1"

    <Tool
    Name="VCPreBuildEventTool"
    />
    <Tool
    Name="VCCustomBuildTool"
    />
    <Tool
    Name="VCXMLDataGeneratorTool"
    />
    <Tool
    Name="VCWebServiceProxyGeneratorTool"
    />
    <Tool
    Name="VCMIDLTool"
    />
    <Tool
    Name="VCCLCompilerTool"
    Optimization="2"
    EnableIntrinsicFunctions="true"
    RuntimeLibrary="2"
    EnableFunctionLevelLinking="true"
    WarningLevel="3"
    DebugInformationFormat="3"
    />
    <Tool
    Name="VCManagedResourceCompilerTool"
    />
    <Tool
    Name="VCResourceCompilerTool"
    />
    <Tool
    Name="VCPreLinkEventTool"
    />
    <Tool
    Name="VCLinkerTool"
    GenerateDebugInformation="true"
    OptimizeReferences="2"
    EnableCOMDATFolding="2"
    TargetMachine="1"
    />
    <Tool
    Name="VCALinkTool"
    />
    <Tool
    Name="VCManifestTool"
    />
    <Tool
    Name="VCXDCMakeTool"
    />
    <Tool
    Name="VCBscMakeTool"
    />
    <Tool
    Name="VCFxCopTool"
    />
    <Tool
    Name="VCAppVerifierTool"
    />
    <Tool
    Name="VCPostBuildEventTool"
    />
    </Configuration>
    </Configurations>
    <References>
    </References>
    <Files>
    <Filter
    Name="Source Files"
    Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
    UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"

    <File
    RelativePath=".\\DataController.cpp"
    >
    </File>
    <File
    RelativePath=".\\DataItem.cpp"
    >
    </File>
    <File
    RelativePath=".\\MyDockWidget.cpp"
    >
    </File>
    </Filter>
    <Filter
    Name="Header Files"
    Filter="h;hpp;hxx;hm;inl;inc;xsd"
    UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"

    <File
    RelativePath=".\\DataController.h"
    >
    </File>
    <File
    RelativePath=".\\DataItem.h"
    >
    </File>
    <File
    RelativePath=".\\MyDockWidget.h"
    >
    </File>
    </Filter>
    <Filter
    Name="Resource Files"
    Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
    UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"

    </Filter>
    </Files>
    <Globals>
    </Globals>
    </VisualStudioProject>
    @

    Thank you for your patience. Cheers Huck

    [EDIT: code formatting, use @-tags, not 'quote', Volker]



  • Hi,

    I see two bugs in there:

    you do not link the QtCore.lib in release mode

    You link debug and release lib in debug mode.

    Correct this and try again please.



  • additionally, you would typically have some stuff in the Globals section:

    @
    <Globals>
    <Global
    Name="MocDir"
    Value=".\\GeneratedFiles\\$(ConfigurationName)"
    />
    <Global
    Name="QtVersion"
    Value="MSVS2008SP1"
    />
    <Global
    Name="RccDir"
    Value=".\\GeneratedFiles"
    />
    <Global
    Name="UicDir"
    Value=".\\GeneratedFiles"
    />
    </Globals>
    </VisualStudioProject>
    @

    EDIT: this is used by the Qt plugin for MSVS



  • They're empty..
    @ <Globals>
    </Globals>@

    What was MSDEV? (previous post)



  • [quote author="Gerolf" date="1309865412"]Hi, I see two bugs in there: # you do not link the QtCore.lib in release mode # You link debug and release lib in debug mode. Correct this and try again please.[/quote]

    Thank you Gerolf. Now, I can compile link and run my program.
    Project --> Properties --> Linker --> Input --> Additional dependecies --> PathToCore4Lib\QtCore4.lib

    And I have same error with my QHash. It was reproducable.

    Here is my sourcecode again:
    MyDockWidget cpp and h
    @
    #include "MyDockWidget.h"
    #include "DataController.h"

    MyDockWidget::MyDockWidget( )
    {
    }

    int main(int p_argsc, char *p_argsv[] )
    {
    DataController myDataController;
    myDataController.addNew(2511, "Heim", 20481, 1272923);
    myDataController.addNew(2512, "Work", 20482, 1272963);
    // Breakpoint here
    return 1;
    }

    // here header
    #ifndef MY_DOCK_WIDGET_H
    #define My_DOCK_WIDGET_H
    #include <QString>
    #include "DataController.h"

    class MyDockWidget
    {
    public:
    MyDockWidget();
    DataController myDataController;
    };
    #endif // MY_DOCK_WIDGET_H
    @

    DataController cpp and h
    @
    #include <QHash>
    #include "DataController.h"
    #include "DataItem.h"

    void DataController::addNew(qint32 tID, QString tName, qint32 tCat, qint32 tCon)
    {
    DataItem * tPI = new DataItem(tID, tName, tCat, tCon);
    this->myQHash.insert(tID, tPI);
    }

    DataController::~DataController(void) {}

    // here header
    #pragma once

    #include <QString>
    #include <QHash>
    #include "DataItem.h"

    class DataController
    {
    public:
    ~DataController(void);
    void addNew(qint32, QString, qint32, qint32);
    private:
    QHash<qint32, DataItem*> myQHash;
    };
    @

    DataItem cpp and h
    @
    #include "DataItem.h"
    #include <QString>
    DataItem::DataItem()
    {
    this->dataID = 0;
    this->dataCon = 0;
    this->dataCat = 0;
    this->dataName = "defName";
    }

    DataItem::DataItem(qint32 tId, QString tName, qint32 tCat, qint32 tCon)
    {
    this->dataID = tId;
    this->dataCon = tCon;
    this->dataCat = tCat;
    this->dataName = tName;
    }

    qint32 DataItem::getID() const { return this->dataID; }

    QString DataItem::getName() const { return this->dataName; }

    qint32 DataItem::getCat() const { return this->dataCat; }

    qint32 DataItem::getCon() const { return this->dataCon; }

    DataItem::~DataItem(void) {}

    // here header
    #pragma once

    #include <QString>

    class DataItem
    {
    public:
    DataItem();
    DataItem(qint32 tId, QString tName, qint32 tCat, qint32 tCon);
    ~DataItem(void);

    qint32 getID() const;
    QString getName() const;
    qint32 getCat() const;
    qint32 getCon() const;

    private:
    qint32 dataID;
    QString dataName;
    qint32 dataCat;
    qint32 dataCon;
    };
    @

    Cheers Huck



  • and here you have the log of my myDataController from the Watch window:

    @- myDataController {myQHash={...} } DataController

    • myQHash {d=0x003d35a0 e=0x003d35a0 } QHash<int,DataItem *>
    • d 0x003d35a0 {fakeNext=0x00000000 buckets=0x003d35d8 ref={...} ...} QHashData *
    • fakeNext 0x00000000 {next=??? h=??? } QHashData::Node *
    • buckets 0x003d35d8 QHashData::Node * *
    • ref {_q_value=1 } QBasicAtomicInt
      size 2 int
      nodeSize 12 int
      userNumBits 4 short
      numBits 4 short
      numBuckets 17 int
      sharable 1 unsigned int
    • e 0x003d35a0 {next=0x00000000 h=4011480 key=4011480 ...} QHashNode<int,DataItem *> *
    • next 0x00000000 {next=??? h=??? key=??? ...} QHashNode<int,DataItem *> *
      next CXX0030: Error: expression cannot be evaluated
      h CXX0030: Error: expression cannot be evaluated
      key CXX0030: Error: expression cannot be evaluated
      value CXX0030: Error: expression cannot be evaluated
      h 4011480 unsigned int
      key 4011480 int
    • value 0x00000001 {dataID=??? dataName={...} dataCat=??? ...} DataItem *
      dataID CXX0030: Error: expression cannot be evaluated
    • dataName {d=??? } QString
      d CXX0017: Error: symbol "" not found
      dataCat CXX0030: Error: expression cannot be evaluated
      dataCon CXX0030: Error: expression cannot be evaluated
      @


  • That log does not say much, at least not to me.
    What is the problem now? I.e. what does the program do, and what did you expect it do?



  • Indeed. I suggest writing unit tests for your classes.



  • Ah ok, let me make this clear:

    I have a in form of --> QHash<qint32, DataItem*>
    DataItem has a few simple attributes int, QString see class.

    Then I push key-value pairs on that QHash
    @myDataController->addNew(2512, "Work", 20482, 1272963);@
    by generating a new DataItemObject by those parameters and store
    <2512, DataItemGeneratedFrom_2512_Work_20482_1272963>

    Then my DataController, which contains my QHash, should store these values in there. As in the example above following values shoule be (2512, "Work", 20482, 1272963), but according to my WatchWindow in debug mode, there are other (not the one I entered above) values in there (see first post and picture in second post).



  • [quote author="ZapB" date="1309869796"]Indeed. I suggest writing unit tests for your classes.[/quote]

    I have never done this before. VS --> Test --> New test... --> Create new
    then I shall insert test logic: @ [TestMethod]
    void TestMethod1()
    {
    //
    // TODO: Add test logic here
    //
    };@

    Any tutorials? Hints? Todos?



  • Hmmm, I am not sure of how to do it with Visual Studio. I use the QtTest framework that ships with Qt. With that you create a sub-project that gets compiled as an application that tests your particular class (you have to write the tests of course). Take a look at the "docs":http://developer.qt.nokia.com/doc/qt-4.7/qtestlib-manual.html#id-df520d0c-f4d5-40a0-a379-b016eb2962a1 for an introduction to QtTest and also a "turorial":http://developer.qt.nokia.com/doc/qt-4.7/qtestlib-tutorial.html#id-286e4ba0-d890-4d30-bb60-4e3e70f88401



  • Unit testing is great, but perhaps learning how to write unit tests for just this problem is a bit of an obstacle.
    I would suggest adding some debug output to your code that shows the contents of the hash table.



  • Yes unit testing is a bind and extra work but it pays dividends as your unit tests can be used to catch regressions much more easily than your production code (assuming your tests are sufficient and hat you actually run them of course).

    Striking the balance is up to the author.



  • [quote author="ZapB" date="1309872749"]Yes unit testing is a bind and extra work but it pays dividends...[/quote]

    Yes this is an issue, I am willing to learn. But not yet. I would be appreciated if anybody can recommend an effective Turtorial or Book regarding Test units with C++ / Qt.

    Back to my problem. Seem to be solved!
    I work with Visual Studio, but without the Qt-addon. SO I 've heard that VS's Debugger somtimes can not interpret Qt typical objects. In real, everything seem be alright, but the debugger shows botched data.

    I inserted a
    @
    const DataItem * DataController::getDataItem(qint32 key) const
    {
    const DataItem * tR = NULL;
    QHash<qint32, DataItem>::const_iterator itf = this->myQHash.find(key);
    if(itf != maQHash.end()) tR = &itf.value();
    return tR;
    }
    @
    I checked myDataController s entries:
    @
    myDataController.addNew(2511, tr("Heim"), 20481);
    myDataController.addNew(2512, tr("Work"), 20482);
    const DataItem *tP1 = myDataController.getDataItem(2511);
    const DataItem *tP2 = myDataController.getDataItem(2512);
    @
    every values in tP1 and tP2 are interpreted correctly.
    So there was much ado about nothing?

    Is it recommended to install the Qt-addon for VS?

    However, I like to thank everyone for your patience.

    Cheers Huck



  • Yes or use Qt-creator for Qt projects instead of MS Visual Studio. I switched and am very glad that I did.

    There is not much to unit tests beyond what is covered in the docs I linked above. They just take time to write - often just as long as the class under test if you cover everything.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.