我最近将我的Qt版本从5.12.3
更新为5.15.2
。我使用InputPanel {}
在QML中重建了一个使用qt虚拟键盘的应用程序。虚拟键盘主要定义为qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
。一切都在发布模式下工作,但当我在调试模式下运行时,我会从qt创建者那里得到以下应用程序输出:
Program: C:Qt5.15.2msvc2019_64binQt5Cored.dll
Module: 5.15.2
File: qvirtualkeyboardinputcontext_p.cpp
Line: 221
ASSERT: "!this->inputPanel" in file qvirtualkeyboardinputcontext_p.cpp, line 221
我检查了Github上5.15.2的源文件,行号指向方法void QVirtualKeyboardInputContextPrivate::registerInputPanel(QObject *inputPanel)
和Q_ASSERT(!this->inputPanel);
。我想将这个方法与5.12.3版的Github进行比较,但看起来这个方法是在5.12.3
之后添加的,因此我以前没有看到错误。
现在,我的理解是,当标志为false时,Q_ASSERT(bool)
将调用qFatal()
。如果inputPanel
属于QObject*
类型,Q_ASSERT是否应为Q_ASSERT(this->inputPanel)
?Q_ASSERT应仅在指针为nullptr时触发。或者我只是困惑?
Qt的错误跟踪器上已经有一个现有的错误报告。以前我只搜索virtualkeyboard而不是InputPanel。错误报告在这里。顺便说一句,这似乎只是调试模式下的一个问题,解决方法是多次单击忽略按钮以在调试模式下继续。
Edit:Qt回应说,这个断言检查是为了确保整个应用程序中只有1个InputPanel
组件。因此,我不确定当我们在MVVM架构设计中有多个动态视图时,InputPanel
应该如何工作,其中每个视图都有自己的自包含InputPanel
。
第2版:根据我上次的编辑评论进行更新。我将InputPanel放在控制StackView的主qml文件中,并且动态加载的视图能够使用相同的InputPanel。