QCombobox::setView приводит к сбою приложения в Windows 7

Я хочу поместить 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. Переместите ВСЕ Qt DDL-файлы в папку приложения
  3. Переместите qwindows.dll в папку платформы.
  4. Скомпилируйте приложение с флагом -O0
  5. Попытка использовать что-то другое вместо QTreeWidget (например, QListWidget также приводит к сбою приложения).

Моя среда:

ОС: Windows 7 x86_64

Версия Qt: 5.5.1 Community Edition, устанавливается онлайн-установщиком.

Компилятор: mingw 4.9.2 32-битная версия (важно, на 64-битных сборках не пробовал).


Вы можете загрузить тестовый проект отсюда: Github Repo


person Pavel.Zh    schedule 04.12.2016    source источник
comment
Это сообщение об ошибке, которое вы получаете для оптимизированной сборки после завершения, после того как среда выполнения обнаружит состояние ошибки. Что происходит, когда вы запускаете отладочную сборку под отладчиком?   -  person Cody Gray    schedule 04.12.2016
comment
@CodyGray, ничего не происходит. Вот мой стек, когда отображается окно ошибки (imgur.com/LrqxIkn). После этого приложение просто закрывается. Никаких SEGFAULT-ов, никакой другой информации.   -  person Pavel.Zh    schedule 04.12.2016
comment
Хорошо, но если вы получаете стек вызовов, отладчик ломается на определенной строке кода (и приложение не будет завершено). Это код, который вы показали в вопросе? Во всяком случае, я могу предположить, что это связано с тем, что другой элемент управления не может быть размещен внутри элемента управления QComboBox. В документации явно сказано, что это возможно? Как правило, это было бы не так с собственными элементами управления Windows, но Qt любит переопределять собственные элементы управления, поэтому это может быть возможно там, если они предприняли особые усилия, чтобы разрешить это.   -  person Cody Gray    schedule 04.12.2016
comment
@CodyGray, у меня есть стек вызовов, потому что я установил точку останова при вызове метода setView. После нажатия F10 (следующий шаг в отладке) приложение просто вылетает без какой-либо отладочной информации. Я не знаю, где и почему он вылетает. Я просто вижу ошибку и после нажатия ОК приложение закрывается. В документации нет места, где разрешено использовать один элемент управления внутри другого, но я этого не делаю. Я помещаю только один вид внутри другого. Если я правильно помню, в WINAPI каждый элемент управления является окном, а в Windows особенно естественно помещать одно окно в другое.   -  person Pavel.Zh    schedule 04.12.2016


Ответы (1)


Из документации QComboBox::setView():

обязательно вызовите setModel() в поле со списком с моделью удобных виджетов перед вызовом этой функции.

Акцент добавлен мной ;)

person E4z9    schedule 04.12.2016
comment
Спасибо и извините за потраченное время. - person Pavel.Zh; 05.12.2016