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 上崩溃应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在QT中怎么隐藏QComboBox的下拉列表并当单击QComboBox的编辑框时,就弹出QListWidget窗口

怎样筛选出股票交易日wind

wind能帮忙加工数据吗

详谈Wind8系统改为Wind7操作步骤

想在wind中试验python接口,该怎么做到

python [IO] wind引入代码及股票名#tags:wind,code