【问题标题】:QCombobox::setView crashes application on windows 7QCombobox::setView 在 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 上运行此代码时,它会导致应用程序崩溃并出现运行时错误:


我尝试过的事情:

  1. 重新安装所有 MS VC++ 可再发行库(版本 2005-2008-2010-2012-2015、32 位和 64 位版本)
  2. ALL Qt DDL-s 移动到应用程序文件夹
  3. qwindows.dll 移至平台文件夹
  4. 使用 -O0 标志编译应用程序
  5. 尝试使用其他方法代替 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 中,将一个窗口放在另一个窗口中是特别原生的。

标签: c++ windows qt windows-7 qt5.5


【解决方案1】:

来自 QComboBox::setView() 文档:

确保方便地调用组合框上的 setModel() 小部件模型调用此函数之前。

我添加的重点;)

【讨论】:

  • 谢谢您,很抱歉浪费您的时间。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多