Details
-
Bug
-
Resolution: Duplicate
-
P2: Important
-
None
-
Qt Creator 9.0.0
-
None
Description
When switching to the issues view while it contains entries, a Qt 6.5-built Qt Creator hangs.
TaskDelegate::sizeHint() is at some point called with a QStyleOptionViewItem that has a 0-sized rect. In that case, later on, QTextLine::setLineWidth() is called with a negative value. Perhaps also some other data is invalid in that call.
Qt 6.4 tolerates that "weird" call. But Qt 6.5 hangs in the "while(true)" loop.
Backtrace of odd TaskDelegate::sizeHint call
ProjectExplorer!ProjectExplorer::Internal::TaskDelegate::sizeHint(class QStyleOptionViewItem * option = 0x0000007d`7f978530, class QModelIndex * index = 0x0000007d`7f9784f8)+0xa3 [qt-creator-qt6\src\plugins\projectexplorer\taskwindow.cpp @ 759] Qt6Widgetsd!QListViewPrivate::itemSize(class QStyleOptionViewItem * option = 0x0000007d`7f978530, class QModelIndex * index = 0x0000007d`7f9784f8)+0xce [qt6_desktop\qtbase\src\widgets\itemviews\qlistview.cpp @ 1905] Qt6Widgetsd!QListView::updateGeometries(void)+0x277 [qt6_desktop\qtbase\src\widgets\itemviews\qlistview.cpp @ 1575] Qt6Widgetsd!QAbstractItemView::doItemsLayout(void)+0x36 [qt6_desktop\qtbase\src\widgets\itemviews\qabstractitemview.cpp @ 1242] Qt6Widgetsd!QListView::doItemsLayout(void)+0x1a8 [qt6_desktop\qtbase\src\widgets\itemviews\qlistview.cpp @ 1558] Qt6Widgetsd!QtPrivate::FunctorCall<QtPrivate::IndexesList<>,QtPrivate::List<>,void,void (<function> * f = 0x0000007d`7f978880, class QAbstractItemView * o = 0x00000194`e606ff20, void ** arg = 0x00000194`e5c15c78)+0x46 [qt6_desktop\qtbase\src\corelib\kernel\qobjectdefs_impl.h @ 135] Qt6Widgetsd!QtPrivate::FunctionPointer<void (<function> * f = 0x0000007d`7f9788e0, class QAbstractItemView * o = 0x00000194`e606ff20, void ** arg = 0x00000194`e5c15c78)+0x3d [qt6_desktop\qtbase\src\corelib\kernel\qobjectdefs_impl.h @ 173] Qt6Widgetsd!QtPrivate::QSlotObject<void (int which = 0n1, class QtPrivate::QSlotObjectBase * this_ = 0x00000194`e938f6f0, class QObject * r = 0x00000194`e606ff20, void ** a = 0x00000194`e5c15c78, bool * ret = 0x00000000`00000000)+0xac [qt6_desktop\qtbase\src\corelib\kernel\qobjectdefs_impl.h @ 385] Qt6Cored!QtPrivate::QSlotObjectBase::call(class QObject * r = 0x00000194`e606ff20, void ** a = 0x00000194`e5c15c78)+0x43 [qt6_desktop\qtbase\src\corelib\kernel\qobjectdefs_impl.h @ 363] Qt6Cored!QMetaCallEvent::placeMetaCall(class QObject * object = 0x00000194`e606ff20)+0x41 [qt6_desktop\qtbase\src\corelib\kernel\qobject.cpp @ 608] Qt6Cored!QObject::event(class QEvent * e = 0x00000194`e5c15c30)+0x1cd [qt6_desktop\qtbase\src\corelib\kernel\qobject.cpp @ 1378] Qt6Widgetsd!QWidget::event(class QEvent * event = 0x00000194`e5c15c30)+0x1c8b [qt6_desktop\qtbase\src\widgets\kernel\qwidget.cpp @ 9285] Qt6Widgetsd!QFrame::event(class QEvent * e = 0x00000194`e5c15c30)+0x40 [qt6_desktop\qtbase\src\widgets\widgets\qframe.cpp @ 515] Qt6Widgetsd!QAbstractScrollArea::event(class QEvent * e = 0x00000194`e5c15c30)+0x896 [qt6_desktop\qtbase\src\widgets\widgets\qabstractscrollarea.cpp @ 1010] Qt6Widgetsd!QAbstractItemView::event(class QEvent * event = 0x00000194`e5c15c30)+0x1af [qt6_desktop\qtbase\src\widgets\itemviews\qabstractitemview.cpp @ 1695] Qt6Widgetsd!QListView::event(class QEvent * e = 0x00000194`e5c15c30)+0x1e [qt6_desktop\qtbase\src\widgets\itemviews\qlistview.cpp @ 1744] Qt6Widgetsd!QApplicationPrivate::notify_helper(class QObject * receiver = 0x00000194`e606ff20, class QEvent * e = 0x00000194`e5c15c30)+0x1ab [qt6_desktop\qtbase\src\widgets\kernel\qapplication.cpp @ 3278] Qt6Widgetsd!QApplication::notify(class QObject * receiver = 0x00000194`e606ff20, class QEvent * e = 0x00000194`e5c15c30)+0x3318 [qt6_desktop\qtbase\src\widgets\kernel\qapplication.cpp @ 3225] Qt6Cored!QCoreApplication::notifyInternal2(class QObject * receiver = 0x00000194`e606ff20, class QEvent * event = 0x00000194`e5c15c30)+0x157 [qt6_desktop\qtbase\src\corelib\kernel\qcoreapplication.cpp @ 1065] Qt6Cored!QCoreApplication::sendEvent(class QObject * receiver = 0x00000194`e606ff20, class QEvent * event = 0x00000194`e5c15c30)+0x7b [qt6_desktop\qtbase\src\corelib\kernel\qcoreapplication.cpp @ 1484] Qt6Cored!QCoreApplicationPrivate::sendPostedEvents(class QObject * receiver = 0x00000000`00000000, int event_type = 0n0, class QThreadData * data = 0x00000194`dbe4cfa0)+0x552 [qt6_desktop\qtbase\src\corelib\kernel\qcoreapplication.cpp @ 1845] Qt6Cored!QEventDispatcherWin32::sendPostedEvents(void)+0x8f [qt6_desktop\qtbase\src\corelib\kernel\qeventdispatcher_win.cpp @ 894] Qt6Guid!QWindowsGuiEventDispatcher::sendPostedEvents(void)+0x15 [qt6_desktop\qtbase\src\gui\platform\windows\qwindowsguieventdispatcher.cpp @ 44] Qt6Cored!QEventDispatcherWin32::processEvents(class QFlags<enum QEventLoop::ProcessEventsFlag> flags = class QFlags<enum QEventLoop::ProcessEventsFlag>)+0xbf [qt6_desktop\qtbase\src\corelib\kernel\qeventdispatcher_win.cpp @ 464] Qt6Guid!QWindowsGuiEventDispatcher::processEvents(class QFlags<enum QEventLoop::ProcessEventsFlag> flags = class QFlags<enum QEventLoop::ProcessEventsFlag>)+0x4b [qt6_desktop\qtbase\src\gui\platform\windows\qwindowsguieventdispatcher.cpp @ 36] Qt6Cored!QEventLoop::processEvents(class QFlags<enum QEventLoop::ProcessEventsFlag> flags = class QFlags<enum QEventLoop::ProcessEventsFlag>)+0x7c [qt6_desktop\qtbase\src\corelib\kernel\qeventloop.cpp @ 101] Qt6Cored!QEventLoop::exec(class QFlags<enum QEventLoop::ProcessEventsFlag> flags = class QFlags<enum QEventLoop::ProcessEventsFlag>)+0x1f4 [qt6_desktop\qtbase\src\corelib\kernel\qeventloop.cpp @ 182] Qt6Cored!QCoreApplication::exec(void)+0x19a [qt6_desktop\qtbase\src\corelib\kernel\qcoreapplication.cpp @ 1386] Qt6Guid!QGuiApplication::exec(void)+0x1a [qt6_desktop\qtbase\src\gui\kernel\qguiapplication.cpp @ 1887] Qt6Widgetsd!QApplication::exec(void)+0xc [qt6_desktop\qtbase\src\widgets\kernel\qapplication.cpp @ 2559] qtcreator!main(int argc = 0n10, char ** argv = 0x00000194`dbde6e70)+0x4135 [qt-creator-qt6\src\app\main.cpp @ 765]
Minimal reproducer (use in QtC with "New Project -> Other Project -> Code Snippet")
#include <QApplication> #include <QTextLayout> int textHeightForWidth(int width) { int height = 0; QTextLayout tl("Foo bar und so"); tl.beginLayout(); while (true) { QTextLine line = tl.createLine(); if (!line.isValid()) break; line.setLineWidth(width); height += line.height(); } tl.endLayout(); return height; } int main(int argc, char *argv[]) { QApplication app(argc, argv); qDebug() << textHeightForWidth(50); qDebug() << textHeightForWidth(-1); // Proceeds with Qt < 6.5, Freezes with Qt 6.5 return 0; }
Attachments
Issue Links
- duplicates
-
QTBUG-109474 6.5: Behavioral change in QTextLine
- Closed