Qt:Paintevent与父母的关系?

时间:2016-03-01 12:16:34

标签: qt

如果我有paprent小部件A,那么我有一个A的子小部件B.B嵌入在A中。

如果我触发A的paintEvent,B的绘画事件会被触发吗? 如果我触发B的paintEvent,是否会触发A的绘制事件?

如果它依赖于其他一些属性,那么属性是什么?透明度? 是否有一般规则,以便我可以知道哪个Widget的绘制事件将被触发?

2 个答案:

答案 0 :(得分:2)

我认为最有帮助的答案是你应该编写<body> <div ng-controller="MainCtrl as mc"> <md-content> <md-toolbar md-scroll-shrink> <div class="md-toolbar-tools"> <span flex="5"></span> <md-button ui-sref="Home"> example.com </md-button> <span flex="20"></span> <span>something something</span> <span flex="20"></span> <md-button ng-show="!login" aria-label="Settings" ui-sref="Login"> Login / Register </md-button> <md-button ng-show="login" class="md-icon-button" aria-label="Settings" ng-click="openRightMenu()"> <md-icon class="material-icons">menu</md-icon> </md-button> <md-sidenav md-component-id="right" class="md-sidenav-right"> <md-button href="http://google.com">Google</md-button> </md-sidenav> </div> </md-toolbar> </md-content> <div ui-view></div> </div> </body> 方法而不关心。因为实际答案取决于您运行的平台,并且您猜测透明度也可能起作用,但是小部件是否是本机支持的也可能很重要。

Qt5总是对所有小部件使用双缓冲绘图,但是未指定实际发生缓冲的粒度(窗口,所有小部件,仅本机支持的小部件)。如果两个小部件都是不透明的,我猜测只会重新绘制您无效的小部件,因为另一个小部件将保留在后备存储中。但是,如果使A无效导致重新绘制B,我也不会感到完全惊讶。

由于您无法控制的事情会导致绘制事件,所以最简单的答案是确保您的绘图代码不关心,并且相信双缓冲机制只在需要时调用您的代码。 (假设你没有过多地调用paintEvent

答案 1 :(得分:1)

如果您依赖于paintEvent可以被调用的情况,那么您做错了。如果窗口小部件可见,则paintEvent必须始终可调用。您必须希望随时调用它,无论系统其他部分发生什么情况。

理想情况下,paintEvent的实现不应修改对象的状态。我发现将实现转发给const帮助程序以使其显而易见是有帮助的:

class MyWidget : public QWidget {
  void paintEvent(QPaintEvent * event) Q_DECL_OVERRIDE {
    QPainter painter(this);
    paintEventImpl(event, painter);
  }
  void paintEventImpl(QPaintEvent *, QPainter &) const;
  ...
};