QCombobox::setView 在 Windows 7 上崩溃应用程序
Posted
技术标签:
【中文标题】QCombobox::setView 在 Windows 7 上崩溃应用程序【英文标题】:QCombobox::setView crashes application on windows 7 【发布时间】:2016-12-04 16:27:13 【问题描述】:我想把 QTreeWidget 放在 QCombobox 对象中。我有以下在 Linux 上运行良好的代码:
QTreeWidget* tree = new QTreeWidget(ui->comboBox);
ui->comboBox->setView(tree);
ui->comboBox->setModel(tree->model());
...但是当我尝试在 x64 windows 7 上运行此代码时,它会导致应用程序崩溃并出现运行时错误:
我尝试过的事情:
-
重新安装所有 MS VC++ 可再发行库(版本 2005-2008-2010-2012-2015、32 位和 64 位版本)
将 ALL Qt DDL-s 移动到应用程序文件夹
将 qwindows.dll 移至平台文件夹
使用 -O0 标志编译应用程序
尝试使用其他方法代替 QTreeWidget(例如 QListWidget 也会导致应用程序崩溃)。
我的环境:
操作系统:Windows 7 x86_64
Qt 版本:5.5.1 社区版,由在线安装程序安装
编译器:mingw 4.9.2 32位版本(很重要,我没有尝试64位版本)。
您可以从这里下载测试项目:Github Repo
【问题讨论】:
这是在运行时检测到错误情况后,在终止时优化构建时收到的错误消息。在调试器下运行调试构建会发生什么? @CodyGray,没有任何反应。这是显示错误窗口时的堆栈 (imgur.com/LrqxIkn)。在该应用程序退出之后。没有 SEGFAULT-s,没有其他信息。 好吧,好吧,但是如果你得到一个调用堆栈,调试器会在特定的代码行上中断(并且应用程序不会被终止)。那是您在问题中显示的代码吗?无论如何,我可以猜测这是因为不能在 QComboBox 控件中托管不同的控件。文档是否明确说明这是可能的?通常这不适用于原生 Windows 控件,但 Qt 喜欢重新实现原生控件,因此如果他们特别努力允许它,它可能会在那里实现。 @CodyGray,我有一个调用堆栈,因为我在调用 setView 方法时设置了一个断点。按 F10(调试的下一步)后,应用程序会崩溃,没有任何调试信息。我不知道它在哪里以及为什么会崩溃。我只看到错误,然后按 OK 应用程序关闭。文档中没有任何地方允许在另一个控件中使用一个控件,但我不这样做。我只将一个视图放在另一个视图中。如果我没记错的话,在 WINAPI 中每个控件都是“窗口”,而在 Windows 中,将一个窗口放在另一个窗口中是特别原生的。 【参考方案1】:来自 QComboBox::setView() 文档:
确保方便地调用组合框上的 setModel() 小部件模型在调用此函数之前。
我添加的重点;)
【讨论】:
谢谢您,很抱歉浪费您的时间。以上是关于QCombobox::setView 在 Windows 7 上崩溃应用程序的主要内容,如果未能解决你的问题,请参考以下文章