有没有办法访问 QMainWindowPrivate 或 QMainWindowLayout?
我正在使用 Qt5,我正在尝试执行此操作:
setCentralWidget(wid);
...
setCentralWidget(nullptr); // i don't want it to do deleteLater() for my wid variable
...
setCentralWidget(wid);
问题是,当我调用 setCentralWidget(nullptr)
时,它会为我的 执行
deleteLater()
wid 变量。
因此,我找到了一种使用 setCentralWidget()
而不删除 wid
变量的方法:
Q_D(QMainWindow);
d->layout->setCentralWidget(nullptr);
但问题是:如何使用私有标头或小部件或其他什么?我的意思是,我无权访问 QMainWindowPrivate 或 QMainWindowLayout ,因为它们是私有的。那么有没有办法访问它们呢?
I'm using Qt5 and I am trying to do this:
setCentralWidget(wid);
...
setCentralWidget(nullptr); // i don't want it to do deleteLater() for my wid variable
...
setCentralWidget(wid);
The problem is that, when I call setCentralWidget(nullptr)
, it does deleteLater()
for my wid
variable.
So, I found a way to use setCentralWidget()
without deleting the wid
variable:
Q_D(QMainWindow);
d->layout->setCentralWidget(nullptr);
But the question is: How to use private headers or widgets or whatever? I mean, I don't have access to QMainWindowPrivate
or QMainWindowLayout
, because they are private. So is there a way to access them?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
OP 的问题是由使用
setCentralWidget(nullptr);
引起的。QMainWindow::setCentralWiget():
(强调我的。)
因此,
必须预期
QMainWindow
将删除wid
。否则,wid
实例可能会成为孤立实例,即内存泄漏。然而,OP 问题可以在不冒险访问 QMainWindow 内部的情况下得到解决(这既不是有意的也没有必要)。
事实上,有一种替代方法可以删除中央小部件并再次接管所有权 - QMainWindow::takeCentralWidget():
(再次强调我的。)
用于演示这一点的 MCVE:
输出:
OP's issue is caused by using
setCentralWidget(nullptr);
.QMainWindow::setCentralWiget():
(Emphasis mine.)
Hence, for
it has to be expected that the
QMainWindow
will delete thewid
. Otherwise, thewid
instance could become orphaned i.e. a memory leak.However, OPs issue can be solved without adventurous accesses to internals of
QMainWindow
(which is neither intended nor necessary).In fact, there is an alternative to remove the central widget and take over the ownership again – QMainWindow::takeCentralWidget():
(Emphasis mine, again.)
An MCVE to demonstrate this:
Output: