Results 1 to 9 of 9

Thread: How to make some items non movable on scene

  1. #1
    Join Date
    Mar 2013
    Posts
    11
    Thanks
    6
    Qt products
    Qt4 Qt5
    Platforms
    Windows Android

    Default How to make some items non movable on scene

    I have a QGraphicsscene which shows a plot with X and Y axis..When user zooms the plot...I want only curve to be zoomed and axis should be fixed at their original position.I have tried using Qt::itemIgnoresTransformation flag for X and Y axis ,,,but X and Y axis are still moving with zooming(with flag set they dont move propotional to zoom factor but they dont stay at their original position).Has anybody come across similar problem with qgraphicsscene?

  2. #2
    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: How to make some items non movable on scene

    Has anybody come across similar problem with qgraphicsscene?
    Yes. It is difficult to implement an x-y data plot using graphics / view for the whole thing because of these scaling problems.

    My solution was to use graphics / view [I]only for the canvas[I] (the region containing the data curves). The axes, titles, etc. were ordinary QWidgets (a custom axis widget, and standard QLabel for titles). The composite widget that holds all of these sub-widgets handles the layout, zooming, resizing, etc.

    The canvas needs to send signals when zooming occurs. The composite widget is connected to these signals and sets the axis ranges appropriately.

    Search for other posts under my name and you will see detailed discussions of how to solve the problem as well as that of keeping labels on the plot the same size even when the plot is zoomed.

  3. The following user says thank you to d_stranz for this useful post:

    tarunrajsingh (3rd April 2013)

  4. #3
    Join Date
    Nov 2010
    Posts
    315
    Thanked 53 Times in 51 Posts
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows Symbian S60 Maemo/MeeGo

    Default Re: How to make some items non movable on scene

    This is simple to solve. Everything what should be scaled should have a common parent widget, and axises shouldn't have such parent.
    Three of objects should look like this:
    MainWidget
    Lauout
    AxisX
    AxisY
    ScaleWidget (it doesn't show own content it is a parent for object to scale, here you apply a transformation)
    element 1 to scale
    element 2 to scale

  5. #4
    Join Date
    Mar 2013
    Posts
    11
    Thanks
    6
    Qt products
    Qt4 Qt5
    Platforms
    Windows Android

    Default Re: How to make some items non movable on scene

    Thanks for the suggestion ...I would try that.Is this a bug in QgraphicsView because in general anyone can end up in a situation where some part of the scene needs to be zoomed and some needs to be static on some mouse action.

  6. #5
    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: How to make some items non movable on scene

    Is this a bug in QgraphicsView
    No. That is the way it is designed to work. Scientific data plots are a special case; in general, when a scene is zoomed, all elements of the scene should also zoom - think of video games, CAD drawings, and things like that.

    As I said, the easiest way for scientific plots or other charts is to implement the part that should zoom separately from the parts that don't, and combine them into a composite widget. I actually use the scale widgets from Qwt for my axes - better than writing all that code from scratch.

  7. #6
    Join Date
    Mar 2013
    Posts
    11
    Thanks
    6
    Qt products
    Qt4 Qt5
    Platforms
    Windows Android

    Default Re: How to make some items non movable on scene

    Hi d_stranz,

    Can you please provide me some pointers using QwtscaleWidget along with Qgraphicsview.I tried getting the visible viewport and update axes(no Qwt) based on that but its not accurate every time.I need to update X and Y axis values based on zoom or pan on my plot.

  8. #7
    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: How to make some items non movable on scene

    This is the layout of my dataplot widget:

    Dataplot.png

    The DataplotWidget is derived from QWidget, and uses a QLabel for the title, up to 4 QwtScaleWidget instances as top / bottom / left / right axes, and another custom widget derived from QGraphicsView as the "canvas" where the data is displayed.

    The DataplotWidget's showEvent() and resizeEvent() each call a protected method named calculateLayout(). The purpose of this method is to eventually calculate the size and position of the canvas by subtracting out the areas occupied by the other widgets in the Dataplot:


    1. Start with the full DataplotWidget rect
    2. If the title is visible, set its position to the top left and set the top of the canvas rect to the bottom of the title rect
    3. If the top axis is visible, set its top to the bottom of the title. Set the top of the canvas to the bottom of the axis
    4. If the bottom axis is visible, set the bottom of the canvas rect to the top of the bottom axis rect
    5. If the left axis is visible, set its top to the top of the canvas and bottom to the bottom of the canvas. Move the left side of the canvas to the right side of the left axis
    6. If the right axis is visible, set its top and bottom to the canvas top and bottom. Move the right side of the canvas to the left side of the axis
    7. if the top and/or bottom axes are visible, adjust their left and right sides to match the canvas left and right.



    The canvas uses an overlay widget to implement zooming. When the left mouse button is clicked in the canvas, the overlay widget is displayed at the same position and size as the canvas widget, and is used to draw the rubberband. If your canvas contains a very complex scene, then it is best to take a snapshot of the contents (i.e. render the graphics view to a pixmap) and use the pixmap as the background of the overlay window. This allows you to smoothly move the rubberband around without triggering paint events in the graphics view. When the mouse is released, the overlay window is hidden and the canvas widget emits a "zoomed( const QRectF & )" signal, where the coordinates of the QRect are in scene coordinates.

    The DataplotWidget is connected to this signal. When it receives it, it adjusts the axis ranges as appropriate. I have implemented zooming only for the left and bottom axes, but you could extend the behaviour by supporting zoom on any orthogonal pair of axes. If I ever need that, I will have to go back and engineer it in.

    Since each of the sub-widgets is derived from QWidget, they all take care of their own painting. The DataplotWidget itself does not have a paintEvent handler. The canvas uses an external QGraphicsScene, but has its own viewport. This allows the same scene to be displayed on more than one dataplot, with different viewports or level of zoom, and more importantly, without duplicating the underlying data. If you do not need to do this, then you can simply a bit by making the scene a member of the dataplot widget.

    Hope this helps a bit. The actual dataplot I have implemented is much more complex than this. The mouse interactions are implemented in a separate class based on QStateMachine, because it supports about 10 different rubberband modes (horizontal line, vertical line, rectangle, horizontal box, vertical box, lasso, etc.) for zooming, panning, range selection, object selection, and so forth. There is a zoom stack that allows the user to zoom in and then pop out to the previous zoom, etc.

  9. The following user says thank you to d_stranz for this useful post:

    tarunrajsingh (16th April 2013)

  10. #8
    Join Date
    Mar 2013
    Posts
    11
    Thanks
    6
    Qt products
    Qt4 Qt5
    Platforms
    Windows Android

    Default Re: How to make some items non movable on scene

    Thanks a lot d_stranz ,I really appreciate this level of detail and it really helps.My implementation is somewhat like yours except Qwtaxis and State machine for mouse interaction.Keeping a zoom stack is a good idea,I was maintaing in vars which was sort of cumbersome.Another difference is apart from rubber band zoom ,I am also zooming with mouse wheel and I am trying to scale my axis with the same zoom factor but somehow its not proportional,I will try with QwtscaleAxis today....Thanks again for help.

  11. #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: How to make some items non movable on scene

    I am also zooming with mouse wheel
    Yes, my state machine also supports mouse wheel zooming, as well as with +/- keys. The state machine has at least 50 states and at least as many transitions. It took a lot of work to write and debug it, but it is intended to support almost any kind of interaction. It doesn't actually depend at all on the graphics-view architecture - all it needs is a pointer to a QWidget and some rectangles that define the pixel and world coordinates of the interaction space.

    The zoom stack in handled by a ZoomManager class; this manager can link several views together, so if you zoom in one view, it causes the same zoom to be set in the other views as well. This is useful if you have two different versions of the same data plotted in two views (like original and "processed" data) and you want the views to be synchronized.

    The ZoomManager is implemented as a template class. It is independent of Qt (and any other windowing system, for that matter). The template argument is a ViewT type; the only requirement for this type is that it have two methods called "ZoomTo( double xMin, double xMax )" and "ZoomTo( double xMin, double xMax, double yMin, double yMax )". In the widget that uses it, you simply create an instance of ZoomManager (can be a member variable on the stack) and set the default zoom rect in world coordinates. The handler for the mouse press event captures the initial mouse position, and the handler for the mouse release event captures the final mouse position, and then calls appropriate method in the ZoomManager (ZoomX, ZoomY, ZoomXY, etc.). The manager takes care of the stack and of notifying other linked views of the new zoom coordinates.

    The only dependencies are on the STL and on the boost tuples template. You could easily replace these with Qt counterparts.

    Qt Code:
    1. #ifndef ZoomManager_H
    2. #define ZoomManager_H
    3.  
    4. #include <list>
    5. #include <deque>
    6. #include <utility>
    7. #include <algorithm>
    8. #include <boost\tuple\tuple.hpp>
    9.  
    10. template < class ViewT >
    11. class ZoomManager
    12. {
    13. private:
    14. class ZoomRect : private boost::tuple< double, double, double, double >
    15. {
    16. typedef enum
    17. {
    18. eXMin = 0,
    19. eXMax = 1,
    20. eYMin = 2,
    21. eYMax = 3
    22. } Offsets;
    23.  
    24. public:
    25. ZoomRect( double xMin = 0.0, double xMax = 100.0, double yMin = 0.0, double yMax = 100.0 )
    26. {
    27. SetRect( xMin, xMax, yMin, yMax );
    28. }
    29.  
    30.  
    31. void GetRect( double & xMin, double & xMax, double & yMin, double & yMax ) const
    32. {
    33. xMin = get< eXMin >();
    34. xMax = get< eXMax >();
    35. yMin = get< eYMin >();
    36. yMax = get< eYMax >();
    37. }
    38.  
    39. void GetRect( double & xMin, double & xMax ) const
    40. {
    41. xMin = get< eXMin >();
    42. xMax = get< eXMax >();
    43. }
    44.  
    45. void SetRect( double xMin, double xMax, double yMin, double yMax )
    46. {
    47. get< eXMin >() = xMin;
    48. get< eXMax >() = xMax;
    49. get< eYMin >() = yMin;
    50. get< eYMax >() = yMax;
    51. }
    52.  
    53. double GetXMin() const { return get< eXMin >(); }
    54. double GetXMax() const { return get< eXMax >(); }
    55. double GetYMin() const { return get< eYMin >(); }
    56. double GetYMax() const { return get< eYMax >(); }
    57. };
    58.  
    59. public:
    60. typedef enum
    61. {
    62. ePanFull = 0,
    63. ePanLine = 1,
    64. ePanPage = 2,
    65. } PanMode;
    66.  
    67. public:
    68. ZoomManager( ViewT * pView = 0 )
    69. : mZoomDepth( -1 )
    70. {
    71. AddLink( pView );
    72. }
    73.  
    74. virtual ~ZoomManager() {}
    75.  
    76. // Attributes
    77. public:
    78. int GetZoomDepth() const { return mZoomDepth; }
    79. void SetZoomDepth( int depth )
    80. {
    81. mZoomDepth = depth;
    82. if ( mZoomDepth > 0 )
    83. {
    84. // Pop the zoom stack until new depth is reached
    85. while ( mStack.size() > size_t( mZoomDepth ) )
    86. mStack.pop_back();
    87. }
    88. }
    89.  
    90. void GetZoomXY( double & xMin, double & xMax, double & yMin, double & yMax ) const
    91. {
    92. GetZoomRect().GetRect( xMin, xMax, yMin, yMax );
    93. }
    94.  
    95. void GetZoomX( double & xMin, double & xMax ) const
    96. {
    97. GetZoomRect().GetRect( xMin, xMax );
    98. }
    99.  
    100. void GetZoomY( double & yMin, double & yMax ) const
    101. {
    102. double dummy;
    103. GetZoomRect().GetRect( dummy, dummy, yMin, yMax );
    104. }
    105.  
    106. // Get / Set the default rectangle for fully zoomed-out state
    107. void GetDefaultZoom( double & xMin, double & xMax, double & yMin, double & yMax ) const
    108. {
    109. xMin = mDefaultRect.GetXMin();
    110. xMax = mDefaultRect.GetXMax();
    111. yMin = mDefaultRect.GetYMin();
    112. yMax = mDefaultRect.GetYMax();
    113. }
    114.  
    115. void SetDefaultZoom( double xMin, double xMax, double yMin = 0.0, double yMax = 100.0 )
    116. {
    117. mDefaultRect.SetRect( xMin, xMax, yMin, yMax );
    118. }
    119.  
    120. // Operations
    121. public:
    122. // Adds a link to the plot; returns true if successful, false if already linked
    123. bool AddLink( ViewT * pView )
    124. {
    125. bool bResult = false;
    126. if ( pView )
    127. {
    128. Links::iterator it = std::find( mLinks.begin(), mLinks.end(), pView );
    129. if ( it == mLinks.end() )
    130. {
    131. mLinks.push_back( pView );
    132. bResult = true;
    133. }
    134. }
    135. return bResult;
    136. }
    137.  
    138. // Removes a link to the plot; returns true if found, false if not
    139. bool RemoveLink( ViewT * pView )
    140. {
    141. bool bResult = false;
    142. Links::iterator it = std::find( mLinks.begin(), mLinks.end(), pView );
    143. if ( it != mLinks.end() )
    144. {
    145. mLinks.erase( it );
    146. bResult = true;
    147. }
    148. return bResult;
    149. }
    150.  
    151. // Zooms X while autoscaling Y
    152. void ZoomX( double xMin, double xMax )
    153. {
    154. PushZoom( ZoomRect( xMin, xMax ) );
    155.  
    156. Links::iterator it = mLinks.begin();
    157. Links::iterator eIt = mLinks.end();
    158. while ( it != eIt )
    159. {
    160. ViewT * pView = *it++;
    161. if ( pView )
    162. pView->ZoomTo( xMin, xMax );
    163. }
    164. }
    165.  
    166. // Zooms Y leaving X unchanged
    167. void ZoomY( double yMin, double yMax )
    168. {
    169. double xMin;
    170. double xMax;
    171. GetZoomX( xMin, xMax );
    172. PushZoom( ZoomRect( xMin, xMax, yMin, yMax ) );
    173.  
    174. Links::iterator it = mLinks.begin();
    175. Links::iterator eIt = mLinks.end();
    176. while ( it != eIt )
    177. {
    178. ViewT * pView = *it++;
    179. if ( pView )
    180. pView->ZoomTo( xMin, xMax, yMin, yMax );
    181. }
    182. }
    183.  
    184. // Zooms both x and y axes
    185. void ZoomXY( double xMin, double xMax, double yMin, double yMax )
    186. {
    187. PushZoom( ZoomRect( xMin, xMax, yMin, yMax ) );
    188.  
    189. Links::iterator it = mLinks.begin();
    190. Links::iterator eIt = mLinks.end();
    191. while ( it != eIt )
    192. {
    193. ViewT * pView = *it++;
    194. if ( pView )
    195. pView->ZoomTo( xMin, xMax, yMin, yMax );
    196. }
    197. }
    198.  
    199. // Zooms out to previous X zoom
    200. void ZoomOutX()
    201. {
    202. double xMin;
    203. double xMax;
    204. PopZoom().GetRect( xMin, xMax );
    205.  
    206. Links::iterator it = mLinks.begin();
    207. Links::iterator eIt = mLinks.end();
    208. while ( it != eIt )
    209. {
    210. ViewT * pView = *it++;
    211. if ( pView )
    212. pView->ZoomTo( xMin, xMax );
    213. }
    214. }
    215.  
    216. // Zooms out to previous Y zoom
    217. void ZoomOutY()
    218. {
    219. // Same as ZoomOutXY for now
    220. double xMin;
    221. double xMax;
    222. double yMin;
    223. double yMax;
    224. PopZoom().GetRect( xMin, xMax, yMin, yMax );
    225.  
    226. Links::iterator it = mLinks.begin();
    227. Links::iterator eIt = mLinks.end();
    228. while ( it != eIt )
    229. {
    230. ViewT * pView = *it++;
    231. if ( pView )
    232. pView->ZoomTo( xMin, xMax, yMin, yMax );
    233. }
    234. }
    235.  
    236.  
    237. // Zooms out to previous X-Y zoom
    238. void ZoomOutXY()
    239. {
    240. double xMin;
    241. double xMax;
    242. double yMin;
    243. double yMax;
    244. PopZoom().GetRect( xMin, xMax, yMin, yMax );
    245.  
    246. Links::iterator it = mLinks.begin();
    247. Links::iterator eIt = mLinks.end();
    248. while ( it != eIt )
    249. {
    250. ViewT * pView = *it++;
    251. if ( pView )
    252. pView->ZoomTo( xMin, xMax, yMin, yMax );
    253. }
    254.  
    255. }
    256.  
    257. // Resets the zoom rectangle to defaults (zoom x, autoscale y)
    258. void ZoomResetX()
    259. {
    260. mStack.clear();
    261.  
    262. double xMin;
    263. double xMax;
    264. mDefaultRect.GetRect( xMin, xMax );
    265.  
    266. Links::iterator it = mLinks.begin();
    267. Links::iterator eIt = mLinks.end();
    268. while ( it != eIt )
    269. {
    270. ViewT * pView = *it++;
    271. if ( pView )
    272. pView->ZoomTo( xMin, xMax );
    273. }
    274. }
    275.  
    276. // Resets the X-Y zoom rectangle to the default
    277. void ZoomResetXY()
    278. {
    279. mStack.clear();
    280.  
    281. double xMin;
    282. double xMax;
    283. double yMin;
    284. double yMax;
    285. mDefaultRect.GetRect( xMin, xMax, yMin, yMax );
    286.  
    287. Links::iterator it = mLinks.begin();
    288. Links::iterator eIt = mLinks.end();
    289. while ( it != eIt )
    290. {
    291. ViewT * pView = *it++;
    292. if ( pView )
    293. pView->ZoomTo( xMin, xMax, yMin, yMax );
    294. }
    295. }
    296.  
    297. // Pans completely to the left or by a line or page, while
    298. // keeping the zoom level the same
    299. void PanLeft( PanMode mode )
    300. {
    301. ZoomRect rect = GetZoomRect();
    302. double xMin = rect.GetXMin();
    303. double xMax = rect.GetXMax();
    304. double width = xMax - xMin;
    305.  
    306. switch( mode )
    307. {
    308. case ePanFull:
    309. {
    310. xMin = mDefaultRect.GetXMin();
    311. xMax = xMin + width;
    312. break;
    313. }
    314.  
    315. case ePanPage:
    316. {
    317. if ( xMin - width >= mDefaultRect.GetXMin() )
    318. {
    319. xMin -= width;
    320. xMax -= width;
    321. }
    322. else
    323. {
    324. xMin = mDefaultRect.GetXMin();
    325. xMax = xMin + width;
    326. }
    327. break;
    328. }
    329.  
    330. case ePanLine:
    331. {
    332. width /= 8;
    333. if ( xMin - width >= mDefaultRect.GetXMin() )
    334. {
    335. xMin -= width;
    336. xMax -= width;
    337. }
    338. else
    339. {
    340. xMin = mDefaultRect.GetXMin();
    341. xMax = xMin + width * 8;
    342. }
    343. break;
    344. }
    345. }
    346.  
    347. PopZoom();
    348. ZoomX( xMin, xMax );
    349.  
    350. }
    351.  
    352. // Pans completely to the right or by a line or page, while
    353. // keeping the zoom level the same
    354. void PanRight( PanMode mode )
    355. {
    356. ZoomRect rect = GetZoomRect();
    357. double xMin = rect.GetXMin();
    358. double xMax = rect.GetXMax();
    359. double width = xMax - xMin;
    360.  
    361. switch( mode )
    362. {
    363. case ePanFull:
    364. {
    365. xMax = mDefaultRect.GetXMax();
    366. xMin = xMax - width;
    367. break;
    368. }
    369.  
    370. case ePanPage:
    371. {
    372. if ( xMax + width <= mDefaultRect.GetXMax() )
    373. {
    374. xMin += width;
    375. xMax += width;
    376. }
    377. else
    378. {
    379. xMax = mDefaultRect.GetXMax();
    380. xMin = xMax - width;
    381. }
    382. break;
    383. }
    384.  
    385. case ePanLine:
    386. {
    387. width /= 8;
    388. if ( xMax + width <= mDefaultRect.GetXMax() )
    389. {
    390. xMin += width;
    391. xMax += width;
    392. }
    393. else
    394. {
    395. xMax = mDefaultRect.GetXMax();
    396. xMin = xMax - width * 8;
    397. }
    398. break;
    399. }
    400. }
    401.  
    402. PopZoom();
    403. ZoomX( xMin, xMax );
    404. }
    405.  
    406. void PanTo( double xPct, double yPct = 0.0 )
    407. {
    408. // TODO: add support for y panning
    409. if ( xPct <= -1.0 )
    410. PanLeft( ePanFull );
    411. else if ( xPct >= 1.0 )
    412. PanRight( ePanFull );
    413. else
    414. {
    415. ZoomRect rect = GetZoomRect();
    416. double xMin = rect.GetXMin();
    417. double xMax = rect.GetXMax();
    418. double width = xMax - xMin;
    419.  
    420. double xMinDef = mDefaultRect.GetXMin();
    421. double xMaxDef = mDefaultRect.GetXMax();
    422.  
    423. xMin = xMinDef + xPct * 0.875 * (xMaxDef - xMinDef);
    424. xMax = xMin + width;
    425.  
    426. if ( xMax > xMaxDef )
    427. {
    428. xMax = xMaxDef;
    429. xMin = xMax - width;
    430. }
    431.  
    432. PopZoom();
    433. ZoomX( xMin, xMax );
    434. }
    435. }
    436.  
    437. protected:
    438. // Pushes the ZoomRect onto the zoom stack while managing stack depth
    439. void PushZoom( const ZoomRect & zoomRect )
    440. {
    441. // If zoom depth is zero, there's no stack so nothing to save
    442. if ( mZoomDepth == 0 )
    443. return;
    444.  
    445. // Save it
    446. mStack.push_front( zoomRect );
    447.  
    448. // Remove the bottom-most entry if the stack is too large
    449. if ( mZoomDepth > 0 && mStack.size() > size_t( mZoomDepth ) )
    450. mStack.pop_back();
    451. }
    452.  
    453. // Pops the ZoomRect from the zoom stack
    454. const ZoomRect & PopZoom()
    455. {
    456. // Remove the current level
    457. if ( !mStack.empty() )
    458. mStack.pop_front();
    459. return GetZoomRect();
    460. }
    461.  
    462. // Retrieves a reference to the current zoom rectangle
    463. const ZoomRect & GetZoomRect() const
    464. {
    465. if ( mStack.empty() )
    466. return mDefaultRect;
    467. else
    468. return mStack.front();
    469. }
    470.  
    471. protected:
    472. typedef std::list< ViewT * > Links;
    473. Links mLinks;
    474.  
    475. typedef std::deque< ZoomRect > Stack;
    476. Stack mStack;
    477.  
    478. int mZoomDepth;
    479. ZoomRect mDefaultRect;
    480. };
    481.  
    482. #endif // ZoomManager_H
    To copy to clipboard, switch view to plain text mode 

  12. The following user says thank you to d_stranz for this useful post:

    tarunrajsingh (18th April 2013)

Similar Threads

  1. Replies: 0
    Last Post: 14th February 2012, 11:03
  2. Moving items in a scene via slots
    By ventura8 in forum Qt Programming
    Replies: 2
    Last Post: 30th August 2011, 15:16
  3. add items into scene
    By Noxxik in forum Qt Programming
    Replies: 0
    Last Post: 9th March 2009, 16:32
  4. Can't move Items in the scene
    By maverick_pol in forum Qt Programming
    Replies: 2
    Last Post: 16th May 2008, 09:40
  5. Cann't move movable items on custom graphics view
    By wojtekw in forum Qt Programming
    Replies: 2
    Last Post: 3rd March 2008, 21:30

Tags for this Thread

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.