c++ - 如何仅在特定事件后使用 QPainter 进行绘画?

标签 c++ qt user-interface

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

问题是,如果我只是在任何函数中创建一个 QPainter,它是行不通的:

QPainter::setPen: Painter not active

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

  1. 我必须为我想在其上绘画的所有小部件派生我的自定义类,因此我无法使用设计器来放置我的小部件。如果有大量小部件,这可能会令人沮丧。

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

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

最佳答案

您可以在设计器中使用自定义小部件: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/

相关文章:

c++ - 将派生类传递给定义为采用基类参数的函数

c++ - << 运算符在 C++ 中不起作用

c++ - 尝试多态性时出错

qt - 在 Qt 中,创建一个带有空白可编辑行的表格

java - 如何为包含多个 JPanel、JButton 和 JLabel 的 JFrame 设置背景颜色?

C++ "OR"条件被忽略

c++ - 通用项目的 Qt Creator c++11 语法突出显示

c++ - 尝试获取文件 MD5 时 Qt 程序卡住

不使用 FXML 的 Stage 的 JavaFx USE_COMPUTED_SIZE

android - ImageView 周围不需要的填充