Skip to content

Commit 33eea7b

Browse files
tdf#130857 qt weld: Block toggled signal for new entry
When the TreeView has special checkboxes enabled, block signals while calling QStandardItem::setCheckable for the item in the first column. This prevents triggering the QAbstractItemModel::dataChanged signal which would trigger weld::TreeView::signal_toggled from QtInstanceTreeView::handleDataChanged for the newly inserted row. Since the row is new, there is no logical change from a previous value from the weld API perspective. This fixes a crash otherwise seen with upcoming commit Change-Id: I6262b0e9d235f9efc6cde81614d42ba28025989d Author: Michael Weghorn <[email protected]> Date: Mon Oct 6 11:28:33 2025 +0200 tdf#130857 qt weld: Support Writer "Caption" dialog when triggering the then newly supported dialog. Backtrace: Thread 1 received signal SIGSEGV, Segmentation fault. rtl::OUString::isEmpty (this=0x18) at include/rtl/ustring.hxx:839 839 return pData->length == 0; (rr) bt #0 rtl::OUString::isEmpty (this=0x18) at include/rtl/ustring.hxx:839 #1 0x00007fd750a9fb07 in SwCaptionOptPage::UpdateEntry (this=0x55d1ea326dc0, nSelEntry=0) at /home/michi/development/git/libreoffice/sw/source/ui/config/optload.cxx:1235 #2 0x00007fd750aa4e42 in SwCaptionOptPage::ToggleEntryHdl (this=0x55d1ea326dc0, rRowCol={...}) at /home/michi/development/git/libreoffice/sw/source/ui/config/optload.cxx:1344 #3 0x00007fd750a9ce4d in SwCaptionOptPage::LinkStubToggleEntryHdl (instance=0x55d1ea326dc0, data={...}) at /home/michi/development/git/libreoffice/sw/source/ui/config/optload.cxx:1342 #4 0x00007fd78ef17411 in Link<std::pair<weld::TreeIter const&, int> const&, void>::Call (this=0x55d1ea332d70, data={...}) at include/tools/link.hxx:105 #5 0x00007fd78ef112f1 in weld::TreeView::signal_toggled (this=0x55d1ea332d00, rIterCol={...}) at include/vcl/weld.hxx:1011 #6 0x00007fd78eef8507 in QtInstanceTreeView::handleDataChanged (this=0x55d1ea332b50, rTopLeft=..., rBottomRight=..., rRoles=...) at vcl/qt6/../qt5/QtInstanceTreeView.cxx:1214 #7 0x00007fd78ef17f4a in QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void, void (QtInstanceTreeView::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call(void (QtInstanceTreeView::*)(QModelIndex const&, QModelIndex const&, QList<int> const&), QtInstanceTreeView*, void**)::{lambda()#1}::operator()() const (this=0x7ffe16a0ef90) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:127 #8 0x00007fd78ef17eb9 in QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void, void (QtInstanceTreeView::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call(void (QtInstanceTreeView::*)(QModelIndex const&, QModelIndex const&, QList<int> const&), QtInstanceTreeView*, void**)::{lambda()#1}>(void**, QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void, void (QtInstanceTreeView::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call(void (QtInstanceTreeView::*)(QModelIndex const&, QModelIndex const&, QList<int> const&), QtInstanceTreeView*, void**)::{lambda()#1}&&) (args=0x7ffe16a0f360, fn=...) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:65 #9 0x00007fd78ef17e83 in QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void, void (QtInstanceTreeView::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call (f=(void (QtInstanceTreeView::*)(QtInstanceTreeView * const, const QModelIndex &, const QModelIndex &, const QList<int> &)) 0x7fd78eef83b0 <QtInstanceTreeView::handleDataChanged(QModelIndex const&, QModelIndex const&, QList<int> const&)>, o=0x55d1ea332b50, arg=0x7ffe16a0f360) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:126 #10 0x00007fd78ef17dfd in QtPrivate::FunctionPointer<void (QtInstanceTreeView::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call<QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void> (f=(void (QtInstanceTreeView::*)(QtInstanceTreeView * const, const QModelIndex &, const QModelIndex &, const QList<int> &)) 0x7fd78eef83b0 <QtInstanceTreeView::handleDataChanged(QModelIndex const&, QModelIndex const&, QList<int> const&)>, o=0x55d1ea332b50, arg=0x7ffe16a0f360) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:174 #11 0x00007fd78ef17d26 in QtPrivate::QCallableObject<void (QtInstanceTreeView::*)(QModelIndex const&, QModelIndex const&, QList<int> const&), QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void>::impl (which=1, this_=0x55d1ea270ae0, r=0x55d1ea332b50, a=0x7ffe16a0f360, ret=0x0) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:545 #12 0x00007fd78dce95e2 in QtPrivate::QSlotObjectBase::call (this=0x55d1ea270ae0, r=0x55d1ea332b50, a=0x7ffe16a0f360) at qtbase/src/corelib/kernel/qobjectdefs_impl.h:461 #13 0x00007fd78df1400f in doActivate<false> (sender=0x55d1ea25a160, signal_index=3, argv=0x7ffe16a0f360) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4342 #14 0x00007fd78df0a353 in QMetaObject::activate (sender=0x55d1ea25a160, m=0x7fd78e85ee68 <QAbstractItemModel::staticMetaObject>, local_signal_index=0, argv=0x7ffe16a0f360) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4402 #15 0x00007fd78e36b5ce in QMetaObject::activate<void, QModelIndex, QModelIndex, QList<int> > (sender=0x55d1ea25a160, mo=0x7fd78e85ee68 <QAbstractItemModel::staticMetaObject>, local_signal_index=0, ret=0x0, args=..., args=..., args=...) at qtbase/src/corelib/kernel/qobjectdefs.h:319 #16 0x00007fd78e3667f0 in QAbstractItemModel::dataChanged (this=0x55d1ea25a160, _t1=..., _t2=..., _t3=...) at qtbase/src/corelib/Core_autogen/include/moc_qabstractitemmodel.cpp:658 #17 0x00007fd78e3f83c4 in QSortFilterProxyModelPrivate::_q_sourceDataChanged (this=0x55d1e2894d60, source_top_left=..., source_bottom_right=..., roles=...) at /home/michi/development/git/qt5/qtbase/src/corelib/itemmodels/qsortfilterproxymodel.cpp:1528 #18 0x00007fd78e43c83e in QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void, void (QSortFilterProxyModelPrivate::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call(void (QSortFilterProxyModelPrivate::*)(QModelIndex const&, QModelIndex const&, QList<int> const&), QSortFilterProxyModelPrivate*, void**)::{lambda()#1}::operator()() const (this=0x7ffe16a0f8a0) at qtbase/src/corelib/kernel/qobjectdefs_impl.h:127 #19 0x00007fd78e43c79d in QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void, void (QSortFilterProxyModelPrivate::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call(void (QSortFilterProxyModelPrivate::*)(QModelIndex const&, QModelIndex const&, QList<int> const&), QSortFilterProxyModelPrivate*, void**)::{lambda()#1}>(void**, QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void, void (QSortFilterProxyModelPrivate::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call(void (QSortFilterProxyModelPrivate::*)(QModelIndex const&, QModelIndex const&, QList<int> const&), QSortFilterProxyModelPrivate*, void**)::{lambda()#1}&&) (args=0x7ffe16a0fc80, fn=...) at qtbase/src/corelib/kernel/qobjectdefs_impl.h:65 #20 0x00007fd78e43c757 in QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void, void (QSortFilterProxyModelPrivate::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call (f=(void (QSortFilterProxyModelPrivate::*)(QSortFilterProxyModelPrivate * const, const QModelIndex &, const QModelIndex &, const QList<int> &)) 0x7fd78e3f74a0 <QSortFilterProxyModelPrivate::_q_sourceDataChanged(QModelIndex const&, QModelIndex const&, QList<int> const&)>, o=0x55d1e2894d60, arg=0x7ffe16a0fc80) at qtbase/src/corelib/kernel/qobjectdefs_impl.h:126 #21 0x00007fd78e43c6c1 in QtPrivate::FunctionPointer<void (QSortFilterProxyModelPrivate::*)(QModelIndex const&, QModelIndex const&, QList<int> const&)>::call<QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void> (f=(void (QSortFilterProxyModelPrivate::*)(QSortFilterProxyModelPrivate * const, const QModelIndex &, const QModelIndex &, const QList<int> &)) 0x7fd78e3f74a0 <QSortFilterProxyModelPrivate::_q_sourceDataChanged(QModelIndex const&, QModelIndex const&, QList<int> const&)>, o=0x55d1e2894d60, arg=0x7ffe16a0fc80) at qtbase/src/corelib/kernel/qobjectdefs_impl.h:174 #22 0x00007fd78e43c5f0 in QtPrivate::QPrivateSlotObject<void (QSortFilterProxyModelPrivate::*)(QModelIndex const&, QModelIndex const&, QList<int> const&), QtPrivate::List<QModelIndex const&, QModelIndex const&, QList<int> const&>, void>::impl (which=1, this_=0x55d1ea25a960, r=0x55d1ea25a160, a=0x7ffe16a0fc80, ret=0x0) at qtbase/src/corelib/kernel/qobject_p.h:272 #23 0x00007fd78dce95e2 in QtPrivate::QSlotObjectBase::call (this=0x55d1ea25a960, r=0x55d1ea25a160, a=0x7ffe16a0fc80) at qtbase/src/corelib/kernel/qobjectdefs_impl.h:461 #24 0x00007fd78df1400f in doActivate<false> (sender=0x55d1ea259540, signal_index=3, argv=0x7ffe16a0fc80) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4342 #25 0x00007fd78df0a353 in QMetaObject::activate (sender=0x55d1ea259540, m=0x7fd78e85ee68 <QAbstractItemModel::staticMetaObject>, local_signal_index=0, argv=0x7ffe16a0fc80) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4402 #26 0x00007fd78e36b5ce in QMetaObject::activate<void, QModelIndex, QModelIndex, QList<int> > (sender=0x55d1ea259540, mo=0x7fd78e85ee68 <QAbstractItemModel::staticMetaObject>, local_signal_index=0, ret=0x0, args=..., args=..., args=...) at qtbase/src/corelib/kernel/qobjectdefs.h:319 #27 0x00007fd78e3667f0 in QAbstractItemModel::dataChanged (this=0x55d1ea259540, _t1=..., _t2=..., _t3=...) at qtbase/src/corelib/Core_autogen/include/moc_qabstractitemmodel.cpp:658 #28 0x00007fd78d23d7cd in QStandardItemModelPrivate::itemChanged (this=0x55d1ea259fb0, item=0x55d1ea28adf0, roles=...) at /home/michi/development/git/qt5/qtbase/src/gui/itemmodels/qstandarditemmodel.cpp:568 #29 0x00007fd78d240701 in QStandardItem::setData (this=0x55d1ea28adf0, value=..., role=10) at /home/michi/development/git/qt5/qtbase/src/gui/itemmodels/qstandarditemmodel.cpp:909 #30 0x00007fd78d240ccd in QStandardItem::setCheckable (this=0x55d1ea28adf0, checkable=true) at /home/michi/development/git/qt5/qtbase/src/gui/itemmodels/qstandarditemmodel.cpp:1345 #31 0x00007fd78ef0387f in QtInstanceTreeView::insert(weld::TreeIter const*, int, rtl::OUString const*, rtl::OUString const*, rtl::OUString const*, VirtualDevice*, bool, weld::TreeIter*)::$_0::operator()() const (this=0x55d1ea28a600) at vcl/qt6/../qt5/QtInstanceTreeView.cxx:88 #32 0x00007fd78ef03355 in std::__invoke_impl<void, QtInstanceTreeView::insert(weld::TreeIter const*, int, rtl::OUString const*, rtl::OUString const*, rtl::OUString const*, VirtualDevice*, bool, weld::TreeIter*)::$_0&>(std::__invoke_other, QtInstanceTreeView::insert(weld::TreeIter const*, int, rtl::OUString const*, rtl::OUString const*, rtl::OUString const*, VirtualDevice*, bool, weld::TreeIter*)::$_0&) (__f=...) at /usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/bits/invoke.h:63 #33 0x00007fd78ef03315 in std::__invoke_r<void, QtInstanceTreeView::insert(weld::TreeIter const*, int, rtl::OUString const*, rtl::OUString const*, rtl::OUString const*, VirtualDevice*, bool, weld::TreeIter*)::$_0&>(QtInstanceTreeView::insert(weld::TreeIter const*, int, rtl::OUString const*, rtl::OUString const*, rtl::OUString const*, VirtualDevice*, bool, weld::TreeIter*)::$_0&) (__fn=...) at /usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/bits/invoke.h:113 #34 0x00007fd78ef031fd in std::_Function_handler<void(), QtInstanceTreeView::insert(weld::TreeIter const*, int, rtl::OUString const*, rtl::OUString const*, rtl::OUString const*, VirtualDevice*, bool, weld::TreeIter*)::$_0>::_M_invoke (__functor=...) at /usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/bits/std_function.h:292 #35 0x00007fd78ee2adde in std::function<void()>::operator() (this=0x7ffe16a10278) at /usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/bits/std_function.h:593 #36 0x00007fd78ee2200f in QtInstance::RunInMainThread (this=0x55d1e1053a60, func=...) at vcl/qt6/../qt5/QtInstance.cxx:205 #37 0x00007fd78eef9580 in QtInstanceTreeView::insert (this=0x55d1ea332b50, pParent=0x0, nPos=0, pStr=0x0, pId=0x0, pIconName=0x0, pImageSurface=0x0, bChildrenOnDemand=false, pRet=0x0) at vcl/qt6/../qt5/QtInstanceTreeView.cxx:62 #38 0x00007fd78eef9735 in virtual thunk to QtInstanceTreeView::insert(weld::TreeIter const*, int, rtl::OUString const*, rtl::OUString const*, rtl::OUString const*, VirtualDevice*, bool, weld::TreeIter*) () at /home/michi/development/git/libreoffice/instdir/program/libvclplug_qt6lo.so #39 0x00007fd750a91799 in weld::TreeView::insert (this=0x55d1ea332d00, nRow=-1, pRet=0x0) at include/vcl/weld.hxx:1053 #40 0x00007fd750a90c92 in weld::TreeView::append (this=0x55d1ea332d00, pRet=0x0) at include/vcl/weld.hxx:1056 #41 0x00007fd750a9e2e9 in SwCaptionOptPage::Reset (this=0x55d1ea326dc0, rSet=0x7ffe16a10990) at /home/michi/development/git/libreoffice/sw/source/ui/config/optload.cxx:1096 #42 0x00007fd79c8bdd00 in SfxSingleTabDialogController::SetTabPage (this=0x7ffe16a10938, xTabPage=std::unique_ptr<SfxTabPage> = {...}) at /home/michi/development/git/libreoffice/sfx2/source/dialog/basedlgs.cxx:273 #43 0x00007fd750a99f2d in SwCaptionOptDlg::SwCaptionOptDlg (this=0x7ffe16a10938, pParent=0x55d1e7e35f78, rSet=SfxItemSet of pool 0x55d1e2a38060 with parent 0x0 and Which ranges: [(1, 160), (1000, 1252), (4021, 4078)]) at /home/michi/development/git/libreoffice/sw/source/ui/config/optload.cxx:854 #44 0x00007fd750c21914 in SwCaptionDialog::CaptionHdl (this=0x7fd77c003ea0) at /home/michi/development/git/libreoffice/sw/source/ui/frmdlg/cption.cxx:374 #45 0x00007fd750c2006d in SwCaptionDialog::LinkStubCaptionHdl (instance=0x7fd77c003ea0, data=...) at /home/michi/development/git/libreoffice/sw/source/ui/frmdlg/cption.cxx:371 #46 0x00007fd7976aa801 in Link<weld::Button&, void>::Call (this=0x55d1e7e35748, data=...) at include/tools/link.hxx:105 #47 0x00007fd79768582c in weld::Button::signal_clicked (this=0x55d1e7e35740) at include/vcl/weld.hxx:1563 [...] Change-Id: I7ced40096c5d8cf840db3a185688017e0fdae692 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191954 Tested-by: Jenkins Reviewed-by: Michael Weghorn <[email protected]>
1 parent 184bc3c commit 33eea7b

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

vcl/qt5/QtInstanceTreeView.cxx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,11 @@ void QtInstanceTreeView::insert(const weld::TreeIter* pParent, int nPos, const O
8585
pItem->setIcon(toQPixmap(*pImageSurface));
8686

8787
if (m_bExtraToggleButtonsEnabled)
88+
{
89+
// avoid triggering signal_toggled via QtInstanceTreeView::handleDataChanged for new item
90+
QSignalBlocker aSignalBlocker(m_pModel);
8891
itemFromIndex(toggleButtonModelIndex(QtInstanceTreeIter(aIndex)))->setCheckable(true);
92+
}
8993

9094
if (pRet)
9195
static_cast<QtInstanceTreeIter*>(pRet)->setModelIndex(aIndex);

0 commit comments

Comments
 (0)