Results 1 to 13 of 13

Thread: Stuck creating << and >> operators for my custom class.

  1. #1
    Join Date
    May 2010
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Stuck creating << and >> operators for my custom class.

    I need to create non-member operator<< and operator>> functions for my custom class so that I can stream them to a QByteArray to push as a BLOB in a mySQL database but I am having some problems in creating my << and >> functions.

    I have the following classes
    Qt Code:
    1. class siStorage : public QObject
    2. {
    3. ...
    4. QVector<float> *sImage;
    5. float sImageSum;
    6. float sImage2Sum;
    7. }
    To copy to clipboard, switch view to plain text mode 
    Qt Code:
    1. class siStack : public QObject
    2. {
    3. ...
    4. QList<siStorage*> *stack;
    5. }
    To copy to clipboard, switch view to plain text mode 
    All siStorage in the QList in stack are always the same length, for example 256. And the length of stack can be large, for example > 50,000.

    I would like to write << and >> operators that read and write an siStack object.

    This is what I currently have:
    Qt Code:
    1. QDataStream &operator<< (QDataStream &stream, const siStorage &storage)
    2. {
    3. stream << *(storage.sImage) << storage.siSum << storage.si2Sum;
    4. return stream;
    5. }
    6.  
    7. QDataStream &operator<< (QDataStram &stream, const siStack &stack)
    8. {
    9. for( int = ii = 0; ii < stack.stack.size(); ii++) {
    10. stream << *(stack.stack->at(ii));
    11. }
    12.  
    13. return stream;
    14. }
    To copy to clipboard, switch view to plain text mode 
    Is this the way I should do this? When I check the size of my resulting QByteArray it is about twice the size of what I would expect. I assume there is some overhead by streaming over 50,000 QVectors but I won't expect that much.

    As for the >> operator I have no clue on how to implement it. This will be my first time doing anything like this. Any suggestions or examples will be greatly appreciated.

  2. #2
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    Is this the way I should do this?
    In general yes.

    When I check the size of my resulting QByteArray it is about twice the size of what I would expect.
    Can you show the code for that?


    As for the >> operator I have no clue on how to implement it.
    Exactly like << just the other way around:
    Qt Code:
    1. QDataStream &operator>> (QDataStream &stream, siStorage &storage)
    2. {
    3. stream >> *(storage.sImage) >> storage.siSum >> storage.si2Sum;
    4. return stream;
    5. }
    To copy to clipboard, switch view to plain text mode 
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  3. #3
    Join Date
    May 2010
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    In general yes.
    Is there a way to construct the operator to work for pointers? In the documentation it states that I can do << QList<T> as long as the << operator is defined for T. In my case T is a pointer. This would simplify things so I only need to write << and >> operators for siStorage and I woudn't need to use for loops

    Can you show the code for that?
    Almost all the memory used is stored in stack. Each sImage in siStorage has 256 floats and in this example their are 54,877 siStorage* in stack. So 4 bytes / float * 256 floats / siStorage * 54,877 siStorage / stack = 56,194,048 bytes / stack. But if I do this below I get 112,607,608 bytes, where pStack is a siStack*.

    Qt Code:
    1. QByteArray byteArray;
    2. QBuffer buffer(&byteArray);
    3. buffer.open(QIODevice::WriteOnly);
    4.  
    5. QDataStram out(&buffer);
    6.  
    7. out << *pStack;
    8.  
    9. byteArray.size();
    To copy to clipboard, switch view to plain text mode 

    Exactly like << just the other way around:
    That makes sense. But because of my use of a for loop won't I need the length of the loop first? Another reason why this would be much simpler if I could define << for a siStorage*.

  4. #4
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Wiki edits
    17

    Default Re: Stuck creating << and >> operators for my custom class.

    But because of my use of a for loop won't I need the length of the loop first?
    Yes, so write it to the output stream before you write out the elements of the stack. This is what the standard containers do.

    Is there a particular reason you have allocated your QVector<float> and QList<siStorage *> on the heap rather than as part of the object?
    Last edited by ChrisW67; 30th December 2010 at 23:49.

  5. #5
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    Is there a way to construct the operator to work for pointers? In the documentation it states that I can do << QList<T> as long as the << operator is defined for T. In my case T is a pointer. This would simplify things so I only need to write << and >> operators for siStorage and I woudn't need to use for loops
    I am not sure what exactly you are asking about.
    You can make the operator take a pointer sure, it will not change much.
    However, I am not sure what exactly you have in mind to do with the pointer?
    When you serialize the data to the stream, you have to copy the data it self, there is no way around defreferencing the pointer at some stage in the process. (That is, if I understood you correctly)
    Qt Code:
    1. QDataStream &operator<< (QDataStream &stream, const siStorage *storage)
    2. {
    3. stream << *(storage->sImage) <<storage->siSum << storage->si2Sum;
    4. return stream;
    5. }
    To copy to clipboard, switch view to plain text mode 
    As you can see, there is little difference.

    Almost all the memory used is stored in stack. Each sImage in siStorage has 256 floats and in this example their are 54,877 siStorage* in stack. So 4 bytes / float * 256 floats / siStorage * 54,877 siStorage / stack = 56,194,048 bytes / stack. But if I do this below I get 112,607,608 bytes, where pStack is a siStack*.
    Well, you forgot to add other members in siStorage (such as the two floats) and probably other members in siStack that you didn't show in the code.
    In addition all the member allocations done by the QVector - if you add all of these, this might be considerably more than what you calculated.
    In addition you need to add memory alignment, which might also considerably add if the internal sizes don't align nicely.
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  6. #6
    Join Date
    May 2010
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    Is there a particular reason you have allocated your QVector<float> and QList<siStorage *> on the heap rather than as part of the object?
    Not really. I'm kind of learning all of this by the seat of my pants. Can you explain what you mean and why I should to it any different?

    Is there a particular reason you have allocated your QVector<float> and QList<siStorage *> on the heap rather than as part of the object?
    Not really. I'm kind of learning all of this by the seat of my pants. Can you explain what you mean and why I should to it any different?

    Is there a particular reason you have allocated your QVector<float> and QList<siStorage *> on the heap rather than as part of the object?
    Not really. I'm kind of learning all of this by the seat of my pants. Can you explain what you mean and why I should to it any different?

    I am not sure what exactly you are asking about.
    You can make the operator take a pointer sure, it will not change much.
    However, I am not sure what exactly you have in mind to do with the pointer?
    When you serialize the data to the stream, you have to copy the data it self, there is no way around defreferencing the pointer at some stage in the process. (That is, if I understood you correctly)
    This is exactly what I wanted to do. Now my << operator becomes much simpler for my siStack class. I can do this

    Qt Code:
    1. QDataStream &operator<< (QDataStream &stream, const siStack &stack)
    2. {
    3. stream << *stack.stack;
    4. return stream;
    5. }
    To copy to clipboard, switch view to plain text mode 
    instead of

    Qt Code:
    1. QDataStream &operator<< (QDataStream &stream, const siStack &stack)
    2. {
    3. for (int ii = 0; ii < stack.stack->size(); ii ++) {
    4. stream << *(stack.stack->at(ii));
    5. }
    6. return stream;
    7. }
    To copy to clipboard, switch view to plain text mode 
    I also no longer need handle streaming the size of the list since the container will handle it for me. This also simplifies the >> operator.

    Well, you forgot to add other members in siStorage (such as the two floats) and probably other members in siStack that you didn't show in the code.
    I guess I should clarify my example. I modified my code so that siStack only streams stack and siStorage only streams the sImage. So the numbers I present are a true representation of the number of floats used.

    What do you mean by:
    In addition all the member allocations done by the QVector - if you add all of these, this might be considerably more than what you calculated.
    In addition you need to add memory alignment, which might also considerably add if the internal sizes don't align nicely.
    Thanks for you time.
    Last edited by agerlach; 31st December 2010 at 19:35.

  7. #7
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Wiki edits
    17

    Default Re: Stuck creating << and >> operators for my custom class.

    Your initial doubling in the expected file size is because QDataStream stores floats and doubles as 64-bits (i.e. double) unless told otherwise with QDataStream::setFloatingPointPrecision()
    Here is a complete example:
    Qt Code:
    1. #include <QtCore>
    2. #include <QDebug>
    3.  
    4. class siStorage: public QObject
    5. {
    6. Q_OBJECT
    7. public:
    8. siStorage(QObject * parent = 0):
    9. QObject(parent),
    10. sImage(QVector<float>(256, 0.0f)),
    11. sImageSum(0.0f), sImage2Sum(0.0f)
    12. { }
    13.  
    14. QVector<float> sImage;
    15. float sImageSum;
    16. float sImage2Sum;
    17. };
    18.  
    19. QDataStream &operator<< (QDataStream &stream, const siStorage &s)
    20. {
    21. stream << s.sImage << s.sImageSum << s.sImage2Sum;
    22. return stream;
    23. }
    24.  
    25. QDataStream &operator>> (QDataStream &stream, siStorage &s)
    26. {
    27. stream >> s.sImage >> s.sImageSum >> s.sImage2Sum;
    28. return stream;
    29. }
    30.  
    31. class siStack: public QObject
    32. {
    33. Q_OBJECT
    34. public:
    35. siStack(QObject *parent = 0):
    36. QObject(parent)
    37. {
    38. }
    39.  
    40. QList<siStorage*> stack;
    41. };
    42.  
    43. QDataStream &operator<< (QDataStream &stream, const siStack &s)
    44. {
    45. stream << s.stack.size();
    46. foreach (siStorage *storage, s.stack)
    47. stream << *storage;
    48. return stream;
    49. }
    50.  
    51. QDataStream &operator>> (QDataStream &stream, siStack &s)
    52. {
    53. // Make sure it is empty to start
    54. qDeleteAll(s.stack);
    55. s.stack.clear();
    56.  
    57. int stackSize = 0;
    58. stream >> stackSize;
    59. for (int i = 0; i < stackSize; ++i) {
    60. siStorage *storage = new siStorage(&s);
    61. stream >> *storage;
    62. s.stack << storage;
    63. }
    64. return stream;
    65. }
    66.  
    67.  
    68. int main(int argc, char *argv[])
    69. {
    70. QCoreApplication app(argc, argv);
    71.  
    72. // test data 5 * (256 floats + 2 floats)
    73. siStack testStack;
    74. for (int i = 0; i < 5; ++i) {
    75. siStorage *s = new siStorage(&testStack);
    76. testStack.stack << s;
    77. }
    78.  
    79. QFile f("test.out");
    80. f.open(QIODevice::WriteOnly);
    81. QDataStream out(&f);
    82. out.setFloatingPointPrecision(QDataStream::SinglePrecision);
    83. //out.setFloatingPointPrecision(QDataStream::DoublePrecision);
    84. out << testStack;
    85. f.close();
    86.  
    87. siStack newStack;
    88. qDebug() << newStack.stack.size();
    89. f.open(QIODevice::ReadOnly);
    90. QDataStream in(&f);
    91. in >> newStack;
    92. f.close();
    93. qDebug() << newStack.stack.size();
    94. }
    95.  
    96. #include "main.moc"
    To copy to clipboard, switch view to plain text mode 

    On my machine the test file is 5184 bytes (Qt 4.6.3 on Linux), which represents:
    5 * ((256 + 2) * 4) = 5160 bytes of float data
    4 byte list size for the siStack
    5 * 4 byte vector size for sImage
    Last edited by ChrisW67; 31st December 2010 at 23:16.

  8. #8
    Join Date
    May 2010
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    Thanks, the QDataStream precision was the problem with the size of my QByteArray. Unfortunetly I am still having problems with my >> operator, << seems to be working fine. Here are my two classes:

    Qt Code:
    1. class siStorage: public QObject
    2. {
    3. Q_OBJECT
    4. public:
    5. siStorage(QObject *parent = 0) : QObject(parent)
    6. {
    7. this->sImage = new QVector<float>();
    8. }
    9.  
    10. QVector<float> *sImage;
    11. float sImageSum;
    12. float sImage2Sum;
    13. };
    14.  
    15. QDataStream &operator<<(QDataStream &stream, const siStorage *storage)
    16. {
    17. stream << *(storage->sImage) << sImageSum << sImage2Sum;
    18. return stream;
    19. }
    20.  
    21. QDataStream &operator>> (QDataStream &stream, siStorage *storage)
    22. {
    23. storage = new siStorage();
    24. stream >> *(storage->sImage) >> sImageSum >> sImage2Sum;
    25. return stream;
    26. }
    To copy to clipboard, switch view to plain text mode 

    Qt Code:
    1. class siStack: public QObject
    2. {
    3. Q_OBJECT
    4. public:
    5. siStack(QObject *parent=0) : QObject(parent)
    6. {
    7. stack = new QList<siStorage*>();
    8. }
    9.  
    10. void populateStack() { ... }
    11. void pushToDataBase() {
    12. //converts to stack to QByteArray and loads to a database
    13. QByteArray stackByteArray;
    14. QBuffer buffer(&stackByteArray);
    15. buffer.open(QIODevice::WriteOnly);
    16.  
    17. QDataStream out(&buffer);
    18. out.setFloatingPointPrecision(QDataStream::SinglePrecision);
    19.  
    20. out << *(this);
    21.  
    22. ... // Database code
    23. }
    24. void pullFromDataBase(){
    25. //selects BLOB from database, converts to QByteArray, and then places in stack
    26. QByteArray stackByteArray;
    27.  
    28. //... DB code to populate stackByteArray
    29.  
    30.  
    31. QBuffer buffer(&stackByteArray);
    32. buffer.open(QIODevice::ReadOnly);
    33.  
    34. QDataStream in(&buffer);
    35. in.setFloatingPointPrecision(QDataStream::SinglePrecision);
    36.  
    37.  
    38. in >> *(this);
    39.  
    40. }
    41. QList<siStorage*> *stack;
    42. };
    43.  
    44. QDataStream &operator<<(QDataStream &stream, const siStack &stack)
    45. {
    46. stream << *(stack.stack);
    47. return stream;
    48. }
    49.  
    50. QDataStream &operator>>(QDataStream &stream, siStack &stack)
    51. {
    52. stream >> *(stack.stack);
    53. return stream;
    54. }
    To copy to clipboard, switch view to plain text mode 

    But when I test my code it will not allow me to access a siStorage stored in siStack::stack. Here is a short example.

    Qt Code:
    1. siStack *stack = new siStack();
    2. stack->populateStack();
    3. qDebug() << stack->stack->size; //Example size = 5;
    4. qDebug() << *(stack->stack->at(5)->sImage); // displays ok;
    5. stack->pushToDataBase();
    6.  
    7. stack->stack->clear;
    8. qDebug() <<stack->stack->size; size = 0;
    9.  
    10. stack->pullFromDataBase();
    11. qDebug() <<stack->stack->size; // size = 5 as above!
    12. qDebug() << *(stack->stack->at(5)->sImage); // code crashes with error code -1073741819
    13. stack->pullFromDataBase();
    To copy to clipboard, switch view to plain text mode 

  9. #9
    Join Date
    Jan 2008
    Location
    Alameda, CA, USA
    Posts
    5,230
    Thanks
    302
    Thanked 864 Times in 851 Posts
    Qt products
    Qt5
    Platforms
    Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    Why are you defining sImage as a pointer to a QVector<float> and not simply using a QVector<float>? In your usage, you keep dereferencing the pointer *(storage->sImage), so you are treating it as a QVector<float> anyway.

    You've also defined your stack as a QList of pointers. Where are you allocating (new) the pointers in the stack? In the populateStack method?

    There is so much unnecessary dereferencing of pointers going on in your code - you seem to be really confused about pointers, and I suspect that most of the problems you are having are because you are trying to reference the contents of empty or uninitialized pointers, or are trying to stream data into something that hasn't been initialized yet. Get rid of the pointers and replace the code with simple stack allocated objects instead and see if your code works better.

  10. #10
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    this:
    Qt Code:
    1. QDataStream &operator>> (QDataStream &stream, siStorage *storage)
    2. {
    3. storage = new siStorage();
    4. stream >> *(storage->sImage) >> sImageSum >> sImage2Sum;
    5. return stream;
    6. }
    To copy to clipboard, switch view to plain text mode 

    in compbination with this:
    Qt Code:
    1. in >> *(this);
    To copy to clipboard, switch view to plain text mode 
    is dangerous, and probably your problem.

    in your operator, you are giving 'this' as a pointer, then assign a new address to it, and apply your stream on it.
    So now your original 'this' points to the new one you allocated in the '>>' operator, and all hell can break loose if you still have pointers pointing to the original address of siStorage.

    EDIT:
    actually
    Qt Code:
    1. in >> *(this);
    To copy to clipboard, switch view to plain text mode 
    should not compile, since you are dereferencing your pointer...
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  11. #11
    Join Date
    May 2010
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    Why are you defining sImage as a pointer to a QVector<float> and not simply using a QVector<float>? In your usage, you keep dereferencing the pointer *(storage->sImage), so you are treating it as a QVector<float> anyway.
    I keep dereferencing the pointer when using the stream operator because it requires me to. In all of my other methods I don't dereference it. I don't really have a good reason on why I am using pointers other than that is what I always seem to see in examples and because I read once that it was much more difficult for someone to reverse engineer your software if you use pointers. I don't know if that is true though.

    You've also defined your stack as a QList of pointers. Where are you allocating (new) the pointers in the stack? In the populateStack method?
    populateStack allocates the pointers in stack when I need to write stack to the database and the pointers are allocated in QDataStream &operator>> (QDataStream &stream, siStorage *storage) when I try to read the stack from the database.

    There is so much unnecessary dereferencing of pointers going on in your code - you seem to be really confused about pointers, and I suspect that most of the problems you are having are because you are trying to reference the contents of empty or uninitialized pointers, or are trying to stream data into something that hasn't been initialized yet. Get rid of the pointers and replace the code with simple stack allocated objects instead and see if your code works better.
    I cannot argue with you here. Almost all of my programming experience is with Matlab. I never had to worry about pointers there but my code ran so slow I jumped ship to Qt. I think I have a pretty good idea of how to use pointers (thats a big think ), but like I said above, I am dereferencing to be able to use the default >> and << for the QList container.

    I'll test some code without using pointers to see if I can correct this.

    Quote Originally Posted by high_flyer View Post
    this:
    Qt Code:
    1. QDataStream &operator>> (QDataStream &stream, siStorage *storage)
    2. {
    3. storage = new siStorage();
    4. stream >> *(storage->sImage) >> sImageSum >> sImage2Sum;
    5. return stream;
    6. }
    To copy to clipboard, switch view to plain text mode 

    in compbination with this:
    Qt Code:
    1. in >> *(this);
    To copy to clipboard, switch view to plain text mode 
    is dangerous, and probably your problem.

    in your operator, you are giving 'this' as a pointer, then assign a new address to it, and apply your stream on it.
    So now your original 'this' points to the new one you allocated in the '>>' operator, and all hell can break loose if you still have pointers pointing to the original address of siStorage.

    EDIT:
    actually
    Qt Code:
    1. in >> *(this);
    To copy to clipboard, switch view to plain text mode 
    should not compile, since you are dereferencing your pointer...
    If you look at the code again you will see that "this" is a *siStack not *siStorage.

  12. #12
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    If you look at the code again you will see that "this" is a *siStack not *siStorage.
    It doesn't change the problem.
    Your >> operator will only work correctly for NULL pointers.
    Read again what I explained to understand what the problem with your operator is.

    P.S
    Pointers are good and powerful.
    And like with every other great power - it requires great responsibility.
    It is good to give pointers (or reference) as parameters since this way you don't have to move by copy large amount of data - so they are efficient.
    If you don't need polymorphism at the destination, probably reference or even const reference is even better.
    You don't have to be shy about using pointers, but you have to understand how to work with them,when you should, and what are the dangers involved.
    Your >> operator is a mistake, even if it has nothing to do with your current problem - but I think it very much does.
    You should change your pointer to reference, and with that you will both stay slim, and comply with what d_stranz was taking about.
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  13. #13
    Join Date
    May 2010
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Stuck creating << and >> operators for my custom class.

    Well, I got two things from this thread:

    1) I used ChrisW67's solution and everything works great!
    2) I found out that I have a lot to learn about pointers!

    Thanks everyone for your time, patience, and suggestions.

Similar Threads

  1. Creating thread for each function of a class
    By Astrologer in forum Qt Programming
    Replies: 10
    Last Post: 19th April 2010, 18:34
  2. QDataStream class/struct & stream operators
    By darksaga in forum Qt Programming
    Replies: 1
    Last Post: 1st August 2008, 19:40
  3. QPaint Class and QGraphicsScene ....I am stuck !!
    By salmanmanekia in forum Qt Programming
    Replies: 7
    Last Post: 30th May 2008, 15:04
  4. creating treeWidgetItem using emitted signal from thread class
    By santosh.kumar in forum Qt Programming
    Replies: 1
    Last Post: 25th June 2007, 08:37
  5. Creating object of other class in Run() method
    By santosh.kumar in forum Qt Programming
    Replies: 2
    Last Post: 15th May 2007, 15:05

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.