【问题标题】:How to paint with QPainter only after a specific event?如何仅在特定事件之后使用 QPainter 进行绘画?
【发布时间】:2011-08-15 16:36:15
【问题描述】:

我有一个主窗口,上面有一些小部件,每个小部件都需要自己的图形。我想使用 QPainter 在它们上绘制形状、线条等,但只能在特定事件之后,例如按下按钮。

问题是,如果我只是在任何函数中创建一个 QPainter,它就不起作用:

QPainter::setPen: Painter not active

QPainter 方法只能在paintEvent(QPaintEvent *) 函数内调用!这会引发以下问题:

  1. 我必须为我想要绘制的所有小部件派生我的自定义类,所以我不能使用设计器来放置我的小部件。使用大量小部件可能会令人沮丧。

  2. 窗口的每个绘制事件后,小部件会重新绘制自己,例如移动它,或移动它前面的其他窗口。我在这些小部件中做了很多绘图,所以在这些情况下它们会明显闪烁。

有没有更好更简单的方法来解决这个问题?我开始考虑只显示图像,并仅在按下特定按钮时重新制造这些图像。我怀疑这是最优雅的解决方案......

【问题讨论】:

    标签: c++ qt user-interface


    【解决方案1】:

    您可以在设计器中使用自定义小部件:Creating Custom Widgets for Qt Designer

    Qt Designer 基于插件的架构允许编辑用户定义和第三方自定义小部件,就像使用标准 Qt 小部件一样。

    对于您的第二个问题,其中一种方法是为您的每个小部件创建一个QPixmap。当您的小部件的外观需要更改时,您可以在该像素图中绘制(使用 QPainter 的构造函数,该构造函数采用 QPaintDevice - QPixmapQPaintDevice)。

    在您的小部件的paintEvent 函数中,您只需使用该“缓存”像素图填充您的小部件。这样,您只在实际需要时才进行(可能很昂贵的)绘画。

    【讨论】:

    • 根据您的想法,我找到了一个更简单的解决方案:使用 QLabel 而不是 QWidget,我可以直接调用 QLabel.setPixmap,而不会弄乱派生类。
    • 如果这是您需要自定义小部件的唯一原因,那么是的,这是个好主意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多