Results 1 to 16 of 16

Thread: QT4 layout of complex dialog is very slow

  1. #1
    Join Date
    Mar 2006
    Posts
    46
    Thanks
    8
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default QT4 layout of complex dialog is very slow

    I'm having trouble with QT4 taking several seconds to initially layout and display a dialog box I have created which has a hierarchy of widgets / layouts. I have attached pictures of a couple of tabs from this dialog for clarity here:




    The structure is like this

    Qt Code:
    1. QWidget (there is more than one of these tabs, as shown in the pictures)
    2. QVBoxLayout (the parts inside here vary)
    3. QWidget (same structure as previous)
    4. QWidget (same structure as previous)
    To copy to clipboard, switch view to plain text mode 

    Obviously, this is a little complex, but it allows the underlying hierarchical objects to represent themselves simply and independently. The layout manager must be going though some sort of layout oscillations to take so long. Is this normal? Can anyone suggest a structural change that will avoid this? Would a heirarchy of QGridLayouts be more efficient? Or perhaps some layout constraints? How can I debug this layout problem in a manageable way with so many objects?

    Thanks,

    Colby

  2. #2
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,365
    Thanks
    3
    Thanked 5,014 Times in 4,792 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QT4 layout of complex dialog is very slow

    It's not a very complex layout. Could we see the code of the constructor? Or did you use Designer to make that dialog? Maybe you could modify the layout or defer construction of some of the items.

  3. #3
    Join Date
    Mar 2006
    Posts
    46
    Thanks
    8
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: QT4 layout of complex dialog is very slow

    I don't use the Qt Designer - all of this layout is done in code. While investigating with this problem, I changed my code so that creation and presentation are broke into 3 steps

    1. create all widgets (called once)
    2. place all widgets in layout (called once)
    3. update widget contents, show/hide widgets based on data changes (called initially + as needed for changes)

    Actually, I have done some more investigation this morning with a profiler and have discovered some interesting facts. The layout is slow, but it is the creation of the widgets which is really taking most of the time. For example, doing just the following in a parent widget ctor takes 577 milliseconds!

    Qt Code:
    1. lbInfoName = new QLabel;
    2. lbInfo = new QLabel;
    3. lbTableName = new QLabel;
    4. lbType = new QLabel("Type");
    5. cbType = new QComboBox;
    6. ckFlipX = new QCheckBox("Flip X");
    7. ckFlipY = new QCheckBox("Flip Y");
    8. ckSwapXY = new QCheckBox("Swap XY");
    9. lbName = new QLabel("Name");
    10. leName = new QLineEdit;
    11. lbAddress = new QLabel("Address");
    12. leAddress = new QLineEdit;
    13. lbCategory = new QLabel("Category");
    14. cbCategory = new QComboBox;
    15. lbElements = new QLabel("Elements");
    16. leElements = new QLineEdit;
    17. cbScaling = new QComboBox;
    18. lbScaling = new QLabel("Scaling");
    19. pbScaling = new QPushButton("New Scaling...");
    20. teStaticValues = new QTextEdit;
    21. teDescription = new QTextEdit;
    22. gbStaticValues = new QGroupBox;
    23. gbDescription = new QGroupBox;
    To copy to clipboard, switch view to plain text mode 

    There are 6 such parent widgets in my dialog, and along with about 1 second spent on layout and other Qt operations taking another second or more, the dialog takes closer to 6 seconds to display, which is an eternity. I looked more carefully at the time spent in Qt widget ctors, and there wasn't really one type of widget that was much slower than another. Most of the actual CPU cycles end up being spent in the function

    QWidgetPrivate::create_sys

    Which accounts for almost 3.5 seconds (!) of the time to show this dialog.

    I have tried running Debug .vs. Release builds, Plastique .vs. standard styles, but nothing has an effect on the speed. My system is a XPSP2, 2.8GHz P4, 800MHz FSB, 1GB CL2 RAM, AGP8X nVidia GeForce4 MX440 running dual DVI displays. It seems like some core part of creating the widgets on the native OS is slow, perhaps in Windows itself. I just don't see things being slow anywhere else on my system, or even in other parts of my app (although I don't create so many widgets anywhere else).

    Any ideas?
    Last edited by cboles; 17th March 2006 at 19:33.

  4. #4
    Join Date
    Mar 2006
    Posts
    46
    Thanks
    8
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: QT4 layout of complex dialog is very slow

    For completeness, the actual constructor looks like this:

    Qt Code:
    1. EcuTableEditWidget::EcuTableEditWidget(EcuTable* _table,QWidget* parent)
    2. : QWidget(parent)
    3. {
    4. table = _table;
    5.  
    6. lbInfoName = new QLabel;
    7. lbInfo = new QLabel;
    8. lbTableName = new QLabel;
    9. lbType = new QLabel("Type");
    10. cbType = new QComboBox;
    11. ckFlipX = new QCheckBox("Flip X");
    12. ckFlipY = new QCheckBox("Flip Y");
    13. ckSwapXY = new QCheckBox("Swap XY");
    14. lbName = new QLabel("Name");
    15. leName = new QLineEdit;
    16. lbAddress = new QLabel("Address");
    17. leAddress = new QLineEdit;
    18. addressValidator = new QIntValidatorEx(0,0x7FFFFFFF,16,this);
    19. leAddress->setValidator(addressValidator);
    20. lbCategory = new QLabel("Category");
    21. cbCategory = new QComboBox;
    22. lbElements = new QLabel("Elements");
    23. leElements = new QLineEdit;
    24. elementsValidator = new QIntValidatorEx(1,256,10,this);
    25. leElements->setValidator(elementsValidator);
    26. cbScaling = new QComboBox;
    27. lbScaling = new QLabel("Scaling");
    28. pbScaling = new QPushButton("New Scaling...");
    29. teStaticValues = new QTextEdit;
    30. teDescription = new QTextEdit;
    31. gbStaticValues = new QGroupBox;
    32. gbDescription = new QGroupBox;
    33.  
    34. layout();
    35. updateLayout();
    36.  
    37. connect(ckFlipX,SIGNAL(stateChanged(int)),this,SLOT(changeFlipX(int)));
    38. connect(ckFlipY,SIGNAL(stateChanged(int)),this,SLOT(changeFlipY(int)));
    39. connect(ckSwapXY,SIGNAL(stateChanged(int)),this,SLOT(changeSwapXY(int)));
    40. connect(leAddress,SIGNAL(textChanged(const QString&)),this,SLOT(changeAddress(const QString&)));
    41. connect(leElements,SIGNAL(textChanged(const QString&)),this,SLOT(changeElements(const QString&)));
    42. connect(leName,SIGNAL(textChanged(const QString&)),this,SLOT(changeName(const QString&)));
    43. connect(cbCategory,SIGNAL(editTextChanged(const QString&)),this,SLOT(changeCategory(const QString&)));
    44. connect(teDescription,SIGNAL(textChanged()),this,SLOT(changeDescription()));
    45. connect(cbType,SIGNAL(activated(const QString&)),this,SLOT(changeType(const QString&)));
    46. connect(cbScaling,SIGNAL(activated(const QString&)),this,SLOT(changeScaling(const QString&)));
    47. }
    To copy to clipboard, switch view to plain text mode 

  5. #5
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,365
    Thanks
    3
    Thanked 5,014 Times in 4,792 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QT4 layout of complex dialog is very slow

    It would be better if you placed each widget in its place right when you create it -- by setting appropriate parents. This way you'd avoid doubling some of the code which gets executed.

    You could try to get the same layout using Designer and compare times you get to see if the difference is substancial. Designer generates optimal (or almost optimal) code, so if time differs noticable, it is probably because of your code.

  6. The following user says thank you to wysota for this useful post:

    cboles (6th April 2006)

  7. #6
    Join Date
    Mar 2006
    Posts
    46
    Thanks
    8
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: QT4 layout of complex dialog is very slow

    Quote Originally Posted by wysota
    It would be better if you placed each widget in its place right when you create it -- by setting appropriate parents. This way you'd avoid doubling some of the code which gets executed.

    You could try to get the same layout using Designer and compare times you get to see if the difference is substancial. Designer generates optimal (or almost optimal) code, so if time differs noticable, it is probably because of your code.
    Thanks for the advice. I will experiment with creating the widgets with parents, although I assumed this makes things slower as the parents will be switched when they are placed in the layout. The Trolltech Qt examples do things the same way I do. I still find it baffling how the creation of the widgets (no layout, not even being shown) is taking so long. You can see it right in the profiler - they are taking forever (in CPU cycles) to be created. Layout and display times are minor in comparison...

    Colby

  8. #7
    Join Date
    Mar 2006
    Posts
    46
    Thanks
    8
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: QT4 layout of complex dialog is very slow

    Just an update:

    switching from QT 4.0.1 to QT 4.1.0 seems to have made a ~2x difference in the creation speed of these QWidgets. Obviously the problem must be something the Trolls know about...

    Colby

  9. #8
    Join Date
    Mar 2006
    Posts
    46
    Thanks
    8
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: QT4 layout of complex dialog is very slow [SOLVED]

    I have solved this problem. The slow speed is due to creating widgets without parents before attaching them to layouts, e.g.

    Qt Code:
    1. QLabel* label = new QLabel; // SLOW!!!
    2.  
    3. QLabel* label = new QLabel(this); // FAST!!
    To copy to clipboard, switch view to plain text mode 

    The speed difference is huge. Also if you do too many constructions without parents, Qt seems to bog down and freeze up due perhaps to some resource issue. The surprising thing here is that many Qt examples create widgets without parents for use in layouts. This is a definite no-no! I'm going back and fixing this everywhere in my code. Things are going much faster now.

  10. #9
    Join Date
    Jan 2006
    Posts
    109
    Thanks
    2
    Thanked 5 Times in 5 Posts
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11

    Default Re: QT4 layout of complex dialog is very slow [SOLVED]

    Quote Originally Posted by cboles
    Also if you do too many constructions without parents, Qt seems to bog down and freeze up due perhaps to some resource issue.
    I've never heard of a problem with constructing too many widgets without parents. On the other hand I know it's not possible to create more than 2000 or 3000 widgets (or less) on many Windows platforms for lack of GDI resources.
    Quote Originally Posted by cboles
    The surprising thing here is that many Qt examples create widgets without parents for use in layouts. This is a definite no-no!
    Which examples? They will be fixed if that's indeed the case.

  11. #10
    Join Date
    Mar 2006
    Posts
    46
    Thanks
    8
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: QT4 layout of complex dialog is very slow [SOLVED]

    Quote Originally Posted by dimitri
    Which examples? They will be fixed if that's indeed the case.
    Virtually all of them. Take this one for example:

    \Qt\4.1.0\examples\dialogs\standarddialogs\dialog. cpp

    Qt Code:
    1. Dialog::Dialog(QWidget *parent)
    2. : QDialog(parent)
    3. {
    4. errorMessageDialog = new QErrorMessage(this);
    5.  
    6. int frameStyle = QFrame::Sunken | QFrame::Panel;
    7.  
    8. integerLabel = new QLabel;
    9. integerLabel->setFrameStyle(frameStyle);
    10. QPushButton *integerButton =
    11. new QPushButton(tr("QInputDialog::get&Integer()"));
    12.  
    13. doubleLabel = new QLabel;
    14. doubleLabel->setFrameStyle(frameStyle);
    15. QPushButton *doubleButton =
    16. new QPushButton(tr("QInputDialog::get&Double()"));
    17.  
    18. itemLabel = new QLabel;
    19. itemLabel->setFrameStyle(frameStyle);
    20. QPushButton *itemButton = new QPushButton(tr("QInputDialog::getIte&m()"));
    21.  
    22. textLabel = new QLabel;
    23. textLabel->setFrameStyle(frameStyle);
    24. QPushButton *textButton = new QPushButton(tr("QInputDialog::get&Text()"));
    25.  
    26. colorLabel = new QLabel;
    27. colorLabel->setFrameStyle(frameStyle);
    28. QPushButton *colorButton = new QPushButton(tr("QColorDialog::get&Color()"));
    29.  
    30. fontLabel = new QLabel;
    31. fontLabel->setFrameStyle(frameStyle);
    32. QPushButton *fontButton = new QPushButton(tr("QFontDialog::get&Font()"));
    33.  
    34. directoryLabel = new QLabel;
    35. directoryLabel->setFrameStyle(frameStyle);
    36. QPushButton *directoryButton =
    37. new QPushButton(tr("QFileDialog::getE&xistingDirectory()"));
    38.  
    39. openFileNameLabel = new QLabel;
    40. openFileNameLabel->setFrameStyle(frameStyle);
    41. QPushButton *openFileNameButton =
    42. new QPushButton(tr("QFileDialog::get&OpenFileName()"));
    43.  
    44. openFileNamesLabel = new QLabel;
    45. openFileNamesLabel->setFrameStyle(frameStyle);
    46. QPushButton *openFileNamesButton =
    47. new QPushButton(tr("QFileDialog::&getOpenFileNames()"));
    48.  
    49. saveFileNameLabel = new QLabel;
    50. saveFileNameLabel->setFrameStyle(frameStyle);
    51. QPushButton *saveFileNameButton =
    52. new QPushButton(tr("QFileDialog::get&SaveFileName()"));
    53.  
    54. criticalLabel = new QLabel;
    55. criticalLabel->setFrameStyle(frameStyle);
    56. QPushButton *criticalButton =
    57. new QPushButton(tr("QMessageBox::critica&l()"));
    58.  
    59. informationLabel = new QLabel;
    60. informationLabel->setFrameStyle(frameStyle);
    61. QPushButton *informationButton =
    62. new QPushButton(tr("QMessageBox::i&nformation()"));
    63.  
    64. questionLabel = new QLabel;
    65. questionLabel->setFrameStyle(frameStyle);
    66. QPushButton *questionButton =
    67. new QPushButton(tr("QMessageBox::&question()"));
    68.  
    69. warningLabel = new QLabel;
    70. warningLabel->setFrameStyle(frameStyle);
    71. QPushButton *warningButton = new QPushButton(tr("QMessageBox::&warning()"));
    72.  
    73. errorLabel = new QLabel;
    74. errorLabel->setFrameStyle(frameStyle);
    75. QPushButton *errorButton =
    76. new QPushButton(tr("QErrorMessage::show&M&essage()"));
    77.  
    78. connect(integerButton, SIGNAL(clicked()), this, SLOT(setInteger()));
    79. connect(doubleButton, SIGNAL(clicked()), this, SLOT(setDouble()));
    80. connect(itemButton, SIGNAL(clicked()), this, SLOT(setItem()));
    81. connect(textButton, SIGNAL(clicked()), this, SLOT(setText()));
    82. connect(colorButton, SIGNAL(clicked()), this, SLOT(setColor()));
    83. connect(fontButton, SIGNAL(clicked()), this, SLOT(setFont()));
    84. connect(directoryButton, SIGNAL(clicked()),
    85. this, SLOT(setExistingDirectory()));
    86. connect(openFileNameButton, SIGNAL(clicked()),
    87. this, SLOT(setOpenFileName()));
    88. connect(openFileNamesButton, SIGNAL(clicked()),
    89. this, SLOT(setOpenFileNames()));
    90. connect(saveFileNameButton, SIGNAL(clicked()),
    91. this, SLOT(setSaveFileName()));
    92. connect(criticalButton, SIGNAL(clicked()), this, SLOT(criticalMessage()));
    93. connect(informationButton, SIGNAL(clicked()),
    94. this, SLOT(informationMessage()));
    95. connect(questionButton, SIGNAL(clicked()), this, SLOT(questionMessage()));
    96. connect(warningButton, SIGNAL(clicked()), this, SLOT(warningMessage()));
    97. connect(errorButton, SIGNAL(clicked()), this, SLOT(errorMessage()));
    98.  
    99. QGridLayout *layout = new QGridLayout;
    100. layout->setColumnStretch(1, 1);
    101. layout->setColumnMinimumWidth(1, 250);
    102. layout->addWidget(integerButton, 0, 0);
    103. layout->addWidget(integerLabel, 0, 1);
    104. layout->addWidget(doubleButton, 1, 0);
    105. layout->addWidget(doubleLabel, 1, 1);
    106. layout->addWidget(itemButton, 2, 0);
    107. layout->addWidget(itemLabel, 2, 1);
    108. layout->addWidget(textButton, 3, 0);
    109. layout->addWidget(textLabel, 3, 1);
    110. layout->addWidget(colorButton, 4, 0);
    111. layout->addWidget(colorLabel, 4, 1);
    112. layout->addWidget(fontButton, 5, 0);
    113. layout->addWidget(fontLabel, 5, 1);
    114. layout->addWidget(directoryButton, 6, 0);
    115. layout->addWidget(directoryLabel, 6, 1);
    116. layout->addWidget(openFileNameButton, 7, 0);
    117. layout->addWidget(openFileNameLabel, 7, 1);
    118. layout->addWidget(openFileNamesButton, 8, 0);
    119. layout->addWidget(openFileNamesLabel, 8, 1);
    120. layout->addWidget(saveFileNameButton, 9, 0);
    121. layout->addWidget(saveFileNameLabel, 9, 1);
    122. layout->addWidget(criticalButton, 10, 0);
    123. layout->addWidget(criticalLabel, 10, 1);
    124. layout->addWidget(informationButton, 11, 0);
    125. layout->addWidget(informationLabel, 11, 1);
    126. layout->addWidget(questionButton, 12, 0);
    127. layout->addWidget(questionLabel, 12, 1);
    128. layout->addWidget(warningButton, 13, 0);
    129. layout->addWidget(warningLabel, 13, 1);
    130. layout->addWidget(errorButton, 14, 0);
    131. layout->addWidget(errorLabel, 14, 1);
    132. setLayout(layout);
    133.  
    134. setWindowTitle(tr("Standard Dialogs"));
    135. }
    To copy to clipboard, switch view to plain text mode 

    If you instrument with timers a test app that constructs 1000 widgets with and without passing a parent widget pointer, you can easliy see the performance difference.

  12. #11
    Join Date
    Jan 2006
    Posts
    109
    Thanks
    2
    Thanked 5 Times in 5 Posts
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11

    Default Re: QT4 layout of complex dialog is very slow

    As a side-note, creating 1000 widgets at start-up is a bit excessive. It's quite uncommon to build all the application's widgets when starting up. Thinking about it again, I don't think there is any real "no-no" here, and indeed this has never been reported before.

    Anyway, it could be that parenting the widgets results in faster start-up times. However the reason needs to be investigated with a profiler, it could be a Qt inefficiency that could be fixed. Eventually either the examples will be fixed (parenting widgets) or the root cause of the slow-down will be fixed in the Qt library. However it probably won't be a high priority task since other users had never reported this annoyance.

    About the "virtually all of them" it looks like most examples do parent widgets.

  13. #12
    Join Date
    Jan 2006
    Posts
    109
    Thanks
    2
    Thanked 5 Times in 5 Posts
    Qt products
    Qt3 Qt4
    Platforms
    Unix/X11

    Default Re: QT4 layout of complex dialog is very slow

    I've modified example standarddialogs to reproduce the problem and indeed the Dialog constructor needs ~ 120 ms without parent compared to ~ 24 ms with parent on X11. I don't have Windows to test right now. Is the situation much worse on Windows?
    Attached Files Attached Files
    Last edited by dimitri; 17th April 2006 at 13:11.

  14. #13
    Join Date
    Jan 2006
    Location
    Russia
    Posts
    16
    Thanked 5 Times in 4 Posts
    Qt products
    Qt4
    Platforms
    Windows

    Default Re: QT4 layout of complex dialog is very slow

    Quote Originally Posted by dimitri
    I've modified example standarddialogs to reproduce the problem and indeed the Dialog constructor needs ~ 120 ms without parent compared to ~ 24 ms with parent on X11. I don't have Windows to test right now. Is the situation much worse on Windows?
    on windows it takes from 680 to 750 ms without parent object and 60-80 ms with 'this' as parent !
    (tested on winxp sp2 P-4 2.4Ghz 1Gb ram (so swapping shouldn't affect the test), VC++ 2003

    oh, by the way, these results are from debug binaries.

  15. #14
    Join Date
    Mar 2006
    Posts
    46
    Thanks
    8
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: QT4 layout of complex dialog is very slow

    I'm glad someone else is able to repro this problem and see how bad it is on XP... my app was unusable until I made the fix. I'm wondering why more people don't notice this performance problem?

    Quote Originally Posted by shad
    on windows it takes from 680 to 750 ms without parent object and 60-80 ms with 'this' as parent !
    (tested on winxp sp2 P-4 2.4Ghz 1Gb ram (so swapping shouldn't affect the test), VC++ 2003

    oh, by the way, these results are from debug binaries.

  16. The following user says thank you to cboles for this useful post:

    elcuco (22nd April 2006)

  17. #15
    Join Date
    Jan 2006
    Location
    Catalonia
    Posts
    266
    Thanks
    44
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    Windows

    Default Re: QT4 layout of complex dialog is very slow

    cboles, I've been watching your dialog and I've seen that there are some blocks that mantain the same widget structure ("X Axis Throttle Position" and "Y Axis Engine Speed"). My question is: do you use some kind of structure to avoid repeating code creating and placing the widgets? I'm asking it because I have a similar dialog with repeated structures and I want to know what's the common way to fix this.

    PD: I will be grateful if any other person suggest something too
    Last edited by SkripT; 26th April 2006 at 12:34.

  18. #16
    Join Date
    Mar 2006
    Posts
    46
    Thanks
    8
    Thanked 2 Times in 2 Posts
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: QT4 layout of complex dialog is very slow

    I;m not sure if this answers your question, but yes, I don't have to repeat code. The overal dialog is a class

    class EcuTableEditDialog : public QDialog

    which contains ok/cancel buttons and a QTabWidget

    Each tab has a

    class EcuTableMainEditWidget : public QWidget

    which itself contains a layout of multiple

    class EcuTableEditWidget : public QWidget

    which are the "X Axis Throttle Position" and "Y Axis Engine Speed" widgets you are referring to. Each of those widgets has a number of basic control widgets depending on the configuration. The EcuTableMainEditWidget also has different numbers of EcuTableEditWidgets depending if the table is 1,2, or 3D.

    Colby

    Quote Originally Posted by SkripT
    cboles, I've been watching your dialog and I've seen that there are some blocks that mantain the same widget structure ("X Axis Throttle Position" and "Y Axis Engine Speed"). My question is: do you use some kind of structure to avoid repeating code creating and placing the widgets? I'm asking it because I have a similar dialog with repeated structures and I want to know what's the common way to fix this.

    PD: I will be grateful if any other person suggest something too

  19. The following user says thank you to cboles for this useful post:

    SkripT (29th April 2006)

Similar Threads

  1. Issue with Modelless dialog on Mac
    By Satyanarayana Chebrolu in forum Qt Programming
    Replies: 0
    Last Post: 24th February 2009, 11:10
  2. Replies: 2
    Last Post: 9th July 2008, 23:28

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.