我有一个主窗口,上面有一些小部件,每个窗口都需要自己的图形。我想使用QPainter在它们上绘制形状,线条等,但仅限于特定事件之后,例如按下按钮。
问题是,如果我只是在任何函数中创建一个QPainter,它将无法工作:
QPainter::setPen: Painter not active
QPainter方法只能在paintEvent(QPaintEvent *)
函数内调用!这引发了以下问题:
我必须为我想要绘制的所有小部件派生我的自定义类,所以我不能使用Designer来放置我的小部件。这可能会让大量的小部件感到沮丧。
小部件在窗口的每个绘制事件之后重绘自身,例如移动窗口或移动其前面的其他窗口。我在这些小部件中做了很多绘图,因此在这些情况下它们会明显地闪烁。
有没有更好更简单的方法来解决这个问题?我开始考虑只显示图像,并仅在按下特定按钮时重新制作这些图像。我怀疑这是最优雅的解决方案......
答案 0 :(得分:1)
您可以在设计器中使用自定义小部件:Creating Custom Widgets for Qt Designer。
Qt Designer基于插件的架构允许编辑用户定义的第三方自定义小部件,就像使用标准Qt小部件一样。
对于第二个问题,其中一种方法是为每个小部件创建QPixmap
。当您的窗口小部件的外观需要更改时,您将绘制该pixmap(使用QPainter
的构造函数,其中QPaintDevice
- QPixmap
为QPaintDevice
。
在您的小部件的paintEvent
功能中,您只需使用该“缓存”像素图填充您的小部件。这样,你只需要在实际需要时进行(可能是昂贵的)绘画。