我有一个主窗口,上面有一些小部件,每个小部件都需要自己的图形。我想使用 QPainter 在它们上面绘制形状、线条等,但只能在特定事件(例如按下按钮)之后进行。
问题是,如果我只是在任何函数中创建一个 QPainter,它是行不通的:
QPainter::setPen: Painter not active
QPainter 方法只能在 paintEvent(QPaintEvent *)
函数中调用!这引发了以下问题:
我必须为我想在其上绘画的所有小部件派生我的自定义类,因此我无法使用设计器来放置我的小部件。如果有大量小部件,这可能会令人沮丧。
小部件在窗口的每次绘制事件后重新绘制自己,例如四处移动它,或移动它前面的其他窗口。我在这些小部件中做了很多绘图,因此在这些情况下它们会明显闪烁。
有没有更好更简单的方法来解决这个问题?我开始考虑仅显示图像,并仅在按下特定按钮时重新制造这些图像。我怀疑这是最优雅的解决方案...
最佳答案
您可以在设计器中使用自定义小部件:Creating Custom Widgets for Qt Designer .
Qt Designer's plugin-based architecture allows user-defined and third party custom widgets to be edited just like you do with standard Qt widgets.
对于您的第二个问题,其中一种方法是为您的每个小部件创建一个QPixmap
。当您的小部件的外观需要更改时,您可以在该像素图中绘制(使用 QPainter
的构造函数,该构造函数采用 QPaintDevice
- QPixmap
是一个 QPaintDevice
).
在您的小部件的 paintEvent
函数中,您只需使用该“缓存”像素图填充您的小部件。这样,您只在实际需要时才进行(可能很昂贵的)绘画。
关于c++ - 如何仅在特定事件后使用 QPainter 进行绘画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7062953/