如果我有paprent小部件A,那么我有一个A的子小部件B.B嵌入在A中。
如果我触发A的paintEvent,B的绘画事件会被触发吗? 如果我触发B的paintEvent,是否会触发A的绘制事件?
如果它依赖于其他一些属性,那么属性是什么?透明度? 是否有一般规则,以便我可以知道哪个Widget的绘制事件将被触发?
答案 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;
...
};