QWidget::repaint:在调试中的Windows上检测到递归重绘,而不创建新线程



以下代码有时会在调试中的Windows x64上失败: 我关闭_mainView并看到空的白色形式的_loginView然后程序崩溃并显示QWidget::repaint: Recursive repaint detected消息。我自己不会在我的应用程序中创建任何线程。

void GuiLauncher::handleOnLogin()
{
_loginView->hide();
_loginView.reset();
_mainView.reset(new MainView{});
CONNECT(*_mainView, onLogout(), *this, handleOnLogout());
_mainView->show();
}
void GuiLauncher::handleOnLogout()
{
_mainView->hide();
_mainView.reset();
_loginView.reset(new LoginView{});
CONNECT(*_loginView, onLogin(), *this, handleOnLogin());
_loginView->show();
}

在 vscode 的调试器中,我得到:

Debug Assertion Failed!
Program: C:Qt5.12.12msvc2017_64binQt5Widgetsd.dll
File: C:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC14.16.27023includevector
Line: 208
Expression: vector iterator range transposed
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
Loaded 'C:WindowsSystem32TextShaping.dll'. 
Second Chance Assertion Failed: File C:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC14.16.27023includevector, Line 208

乍一看我的代码有什么问题吗?感谢您的关注。

事实证明,崩溃(在调试模式下的Windows上)是由于自动生成的UI文件包含:

<widget class="QToolButton" name="button_logout">
</widget>

这将生成代码

QToolButton *button_logout;
button_logout = new QToolButton(widget_session_list);
button_logout->setObjectName(QString::fromUtf8("button_logout"));
header_layout->addWidget(button_logout);

因此,由于此连接而具有单击事件:

...
connect(_ui->button_logout, &QToolButton::clicked, this, &ViewImpl::performLogout);
...
void ViewImpl::performLogout()
{
emit onLogout();
}

导致车窗被hidden后崩溃,并deleted作为对信号的反应onLogout()

所以我问了下一个问题:QToolButton 在单击和窗口初始化时崩溃。

最新更新