Paint widget directly on QListView with QStyledItemDelegate::paint()

前端 未结 1 1246
自闭症患者
自闭症患者 2020-12-12 02:22

After hours of work, I\'m able to paint a widget on QListView. However, the painting is done through a QPixmap. The widget appears, and I can see a

相关标签:
1条回答
  • 2020-12-12 02:44

    Let's make a few things clear:

    1. You're not supposed to create widgets and put them in a model. There's a very good reason for this. Widgets are involved in the Qt event loop, which means that having too many widgets will significantly slow down your program.

    2. Widgets are not simply a bunch of controls (which seems to be how you see them). They take part in the event loop, which is why you should not have a widget that's a part of a data model.

    3. If you're using a multithreaded program and you have our model separated from the view, memory management will become a nightmare. Qt will never tolerate trying to construct or delete any widgets from other threads (which makes sense, since detaching threads from the event loop is not generally thread-safe).

    Given this information, what's the right way to do what you're trying to do? Sadly the only correct way is to draw the controls yourself. If your widget is simple, that's easy to do. If your widget is complicated, you're gonna need lots of math to calculate the positions of every widget.

    In the Qt Torrent Example, you'll see how a progress bar is drawn. All you have to do to draw your controls, is calculate the position, and use the rect member variable as the containing rectangle of the controls, and then draw them (of course, after setting their values). The function paint() has an option.rect parameter in it, which is the rectangle of the whole item. All you have to do, is use some math to calculate the positions inside this rect for every widget.

    PS: NEVER USE ABSOLUTE VALUES FOR THE POSITIONS. You will never get it right, especially for different DPIs.

    That will draw the controls without widgets, and will guarantee the speed you need even for thousands of elements.

    0 讨论(0)
提交回复
热议问题