Need testing for Krita on newer Qt 6.11.0

Hi, all!

We are in progress of updating Krita to the new Qt, Qt 6.11.0. Could you please help with testing the new packages?

There are multiple areas, where the behavior of Krita could change during this update:

  1. Wayland support (run with QT_QPA_PLATFORM=wayland)

    • tablet support
    • cursor switching when tablet is used
    • popup windows and MDI windows
    • cursor switching when popup windows are used

    I do really hope that some of these issues could be resolved by the update :slight_smile:

  2. High FPS displays support. It should still works fine, though Qt got some new code in this area, so it would be nice to test that.

  3. On Windows Angle and OpenGL renderers should still work fine :slight_smile:

  4. Drag-and-drop in the layers docker should still works correctly. Especially when using Ctrl and Shift modifiers to copy/move multiple layers :slight_smile:

The current plan is to release the next stable release with the “old” Qt, i.e. Qt 6.8.0. And then switch to the new version right after that :slight_smile:

Thank you @dkazakov, I’ll test it.

I tested it, and it’s not looking good here:

  • cursor switching (+when popup windows are used) : Had the bug of the OS default arrow cursor + the brush outline right from the start. Then, it went away after moving the cursor away a part of the user interface, I guess. Getting over the Brush Preset Dockers turned the cursor in a single pixel dot… I could also re-trigger the bug with calling a Filter→Color→Color to Alpha filter pop-up windows, and then it was locked into OS default arrow cursor icon + brush outline again. Yes, many cursor bugs.
  • popup windows: Except for the cursor issue, Filter windows behaved normally.
  • MDI windows: I’m using subwindows mode, and couldn’t move more than 100px away a subwindows: the move drag and drop by the title of the subwindows was choppy and glitchy: the content blinks, had difficulty to retrace, overlapping two subwindows felt like if Krita would Freeze. But it recovered, in a glitchy rendering way.
  • tablet support: nothing to report here, on my perspective/hardware: tilt, pressure, etc… Probably more sluggish and feels like less FPS than 6.0.1.

Other observation: an unusual fading-in , fading-out slow and laggy animation for the right-click on canvas palette pop-up. It’s usually instant.

Tested a bit on macOS and Linux (Fedora 44 KDE, Wayland and XWayland). I might still update this later.


  1. Wayland: Pop-up windows

Hovering over the resources in Resources Manager gives instead of a tooltip
qt.qpa.wayland: Failed to create popup. Ensure popup QWidgetWindow(0x55a6ece08380, name="KoItemToolTipClassWindow") has a transientParent set., until clicking on the window. Same thing happens for the layers’ tooltips (NodeToolTipClassWindow).
On Qt6.8 the tooltip would pop-up and instantly close (bug 515578).
On Qt6.11 with XWayland, the tooltips work normally except for the bug where they resize oddly (bug 515577 - though they no longer stretch oddly with Qt6.11 on macOS).

  1. Wayland: MDI windows

The bug where the canvas doesn’t switch when switching tabs/subwindows is still present (bug 515438).


  1. Drag-and-drop in the Layers docker:

I managed to crash Krita while drag-and-dropping multiple layers selected with Ctrl (well, Cmd). Only on Qt6.11, but it could just be that it’s difficult to reproduce consistently.
Two different backtraces. (First backtrace is from my build, but also reproduced on this package.)

Layer moving crash backtrace 1
Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   libsystem_platform.dylib      	       0x19932d3e0 _platform_memmove + 288
1   kritaanimationdocker.so       	       0x135077660 QtPrivate::QPodArrayOps<KisNodeDummy*>::erase(KisNodeDummy**, long long) + 44 (qarraydataops.h:185) [inlined]
2   kritaanimationdocker.so       	       0x135077660 QList<KisNodeDummy*>::remove(long long, long long) + 84 (qlist.h:877) [inlined]
3   kritaanimationdocker.so       	       0x135077660 TimelineNodeListKeeper::slotBeginRemoveDummy(KisNodeDummy*) + 272 (timeline_node_list_keeper.cpp:210)
4   QtCore                        	       0x10beba164 void doActivate<false>(QObject*, int, void**) + 1440
5   libkritaui.21.0.0.dylib       	       0x10712f254 void QMetaObject::activate<void, KisNodeDummy*>(QObject*, QMetaObject const*, int, void*, KisNodeDummy* const&) + 24 (qobjectdefs.h:319) [inlined]
6   libkritaui.21.0.0.dylib       	       0x10712f254 KisDummiesFacadeBase::sigBeginRemoveDummy(KisNodeDummy*) + 60 (moc_kis_dummies_facade_base.cpp:218)
7   libkritaui.21.0.0.dylib       	       0x107282464 KisDummiesFacadeBase::slotContinueRemoveNode(KisSharedPtr<KisNode>) + 128 (kis_dummies_facade_base.cpp:222)
8   libkritaui.21.0.0.dylib       	       0x1072852c0 boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>::operator()(KisDummiesFacadeBase*, KisSharedPtr<KisNode>) const + 48 (mem_fn_template.hpp:165) [inlined]
9   libkritaui.21.0.0.dylib       	       0x1072852c0 void boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>::operator()<boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::rrlist1<KisSharedPtr<KisNode>>>(boost::_bi::type<void>, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>&, boost::_bi::rrlist1<KisSharedPtr<KisNode>>&, int) + 92 (bind.hpp:298)
10  libkritaui.21.0.0.dylib       	       0x1072851e8 void boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>::operator()<KisSharedPtr<KisNode>>(KisSharedPtr<KisNode>&&) + 12 (bind.hpp:1285) [inlined]
11  libkritaui.21.0.0.dylib       	       0x1072851e8 decltype(std::declval<boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>&>()(std::declval<KisSharedPtr<KisNode>>())) std::__1::__invoke[abi:ne190102]<boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>&, KisSharedPtr<KisNode>>(boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>&, KisSharedPtr<KisNode>&&) + 12 (invoke.h:149) [inlined]
12  libkritaui.21.0.0.dylib       	       0x1072851e8 void std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:ne190102]<boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>&, KisSharedPtr<KisNode>>(boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>&, KisSharedPtr<KisNode>&&) + 12 (invoke.h:224) [inlined]
13  libkritaui.21.0.0.dylib       	       0x1072851e8 std::__1::__function::__alloc_func<boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>, std::__1::allocator<boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>>, void (KisSharedPtr<KisNode>)>::operator()[abi:ne190102](KisSharedPtr<KisNode>&&) + 12 (function.h:171) [inlined]
14  libkritaui.21.0.0.dylib       	       0x1072851e8 std::__1::__function::__func<boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>, std::__1::allocator<boost::_bi::bind_t<void, boost::_mfi::mf1<void, KisDummiesFacadeBase, KisSharedPtr<KisNode>>, boost::_bi::list2<boost::_bi::value<KisDummiesFacadeBase*>, boost::arg<1>>>>, void (KisSharedPtr<KisNode>)>::operator()(KisSharedPtr<KisNode>&&) + 40 (function.h:313)
15  libkritaui.21.0.0.dylib       	       0x107284348 std::__1::__function::__value_func<void (KisSharedPtr<KisNode>)>::operator()[abi:ne190102](KisSharedPtr<KisNode>&&) const + 24 (function.h:430) [inlined]
16  libkritaui.21.0.0.dylib       	       0x107284348 std::__1::function<void (KisSharedPtr<KisNode>)>::operator()(KisSharedPtr<KisNode>) const + 24 (function.h:989) [inlined]
17  libkritaui.21.0.0.dylib       	       0x107284348 decltype(std::declval<std::__1::function<void (KisSharedPtr<KisNode>)>&>()(std::declval<KisSharedPtr<KisNode>&>())) std::__1::__invoke[abi:ne190102]<std::__1::function<void (KisSharedPtr<KisNode>)>&, KisSharedPtr<KisNode>&>(std::__1::function<void (KisSharedPtr<KisNode>)>&, KisSharedPtr<KisNode>&) + 44 (invoke.h:149) [inlined]
18  libkritaui.21.0.0.dylib       	       0x107284348 decltype(auto) std::__1::__apply_tuple_impl[abi:ne190102]<std::__1::function<void (KisSharedPtr<KisNode>)>&, std::__1::tuple<KisSharedPtr<KisNode>>&, 0ul>(std::__1::function<void (KisSharedPtr<KisNode>)>&, std::__1::tuple<KisSharedPtr<KisNode>>&, std::__1::__tuple_indices<0ul>) + 44 (tuple:1354) [inlined]
19  libkritaui.21.0.0.dylib       	       0x107284348 decltype(auto) std::__1::apply[abi:ne190102]<std::__1::function<void (KisSharedPtr<KisNode>)>&, std::__1::tuple<KisSharedPtr<KisNode>>&>(std::__1::function<void (KisSharedPtr<KisNode>)>&, std::__1::tuple<KisSharedPtr<KisNode>>&) + 44 (tuple:1358) [inlined]
20  libkritaui.21.0.0.dylib       	       0x107284348 KisSynchronizedConnection<KisSharedPtr<KisNode>>::deliverEventToReceiver() + 304 (KisSynchronizedConnection.h:234)
21  libkritaglobal.21.0.0.dylib   	       0x10596b8bc KisSynchronizedConnectionBase::event(QEvent*) + 144 (KisSynchronizedConnection.cpp:101)
22  QtWidgets                     	       0x10a844b3c QApplicationPrivate::notify_helper(QObject*, QEvent*) + 336
23  QtWidgets                     	       0x10a845bbc QApplication::notify(QObject*, QEvent*) + 468
24  libkritaui.21.0.0.dylib       	       0x1076843f4 KisApplication::processPostponedSynchronizationEvents() + 544 (KisApplication.cpp:959)
25  libkritaui.21.0.0.dylib       	       0x10768ff98 KisApplication::notify(QObject*, QEvent*) + 392 (KisApplication.cpp:925)
26  QtCore                        	       0x10be661b0 QCoreApplication::sendSpontaneousEvent(QObject*, QEvent*) + 172
27  QtGui                         	       0x109a80be4 QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) + 2044
Layer moving crash backtrace 2
Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   libkritaimage.21.0.0.dylib    	       0x1031159f8 KisBaseNode::getKeyframeChannel(QString const&) const + 24
1   kritaanimationdocker.so       	       0x131696140 KisAnimTimelineFramesModel::Private::frameExists(int, int) const + 76
2   kritaanimationdocker.so       	       0x131699710 KisAnimTimelineFramesModel::flags(QModelIndex const&) const + 84
3   QtCore                        	       0x10691cfcc void indexesFromRange<QList<QModelIndex>>(QItemSelectionRange const&, QList<QModelIndex>&) + 540
4   QtCore                        	       0x106926a68 QItemSelectionModel::selectedIndexes() const + 124
5   QtWidgets                     	       0x1053a39d0 QTableView::selectedIndexes() const + 108
6   kritaanimationdocker.so       	       0x1316a9fe4 KisAnimTimelineFramesView::slotTryTransferSelectionBetweenRows(int, int) + 116
7   QtCore                        	       0x106721c50 void doActivate<false>(QObject*, int, void**) + 1420
8   kritaanimationdocker.so       	       0x131668c00 KisAnimTimelineFramesModel::requestTransferSelectionBetweenRows(int, int) + 68
9   kritaanimationdocker.so       	       0x131695a00 KisAnimTimelineFramesModel::slotCurrentNodeChanged(KisSharedPtr<KisNode>) + 556
10  kritaanimationdocker.so       	       0x13166877c KisAnimTimelineFramesModel::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 128
11  QtCore                        	       0x106721c50 void doActivate<false>(QObject*, int, void**) + 1420
12  libkritaui.21.0.0.dylib       	       0x1024b2328 KisNodeManager::sigNodeActivated(KisSharedPtr<KisNode>) + 52
13  libkritaui.21.0.0.dylib       	       0x1026c6bbc KisNodeManager::slotSomethingActivatedNodeImpl(KisSharedPtr<KisNode>) + 584
14  libkritaui.21.0.0.dylib       	       0x1026beb48 KisNodeManager::slotNonUiActivatedNode(KisSharedPtr<KisNode>) + 208
15  libkritaui.21.0.0.dylib       	       0x1024b171c 0x102480000 + 202524
16  QtCore                        	       0x106721c50 void doActivate<false>(QObject*, int, void**) + 1420
17  libkritaui.21.0.0.dylib       	       0x1024a7654 KisDummiesFacadeBase::sigActivateNode(KisSharedPtr<KisNode>) + 52
18  libkritaui.21.0.0.dylib       	       0x102608ca4 KisDummiesFacadeBase::slotNodeActivationRequested(KisSharedPtr<KisNode>, QFlags<KisNodeAdditionFlag>) + 188
19  libkritaui.21.0.0.dylib       	       0x10260c11c 0x102480000 + 1622300
20  libkritaui.21.0.0.dylib       	       0x10260c040 0x102480000 + 1622080
21  libkritaui.21.0.0.dylib       	       0x10260af6c 0x102480000 + 1617772
22  libkritaglobal.21.0.0.dylib   	       0x101e86e6c KisSynchronizedConnectionBase::event(QEvent*) + 140
23  QtWidgets                     	       0x1050acac0 QApplicationPrivate::notify_helper(QObject*, QEvent*) + 336
24  QtWidgets                     	       0x1050adb40 QApplication::notify(QObject*, QEvent*) + 468
25  libkritaui.21.0.0.dylib       	       0x102a39eec KisApplication::processPostponedSynchronizationEvents() + 520
26  libkritaui.21.0.0.dylib       	       0x102a46830 KisApplication::notify(QObject*, QEvent*) + 388
27  QtCore                        	       0x1066cde44 QCoreApplication::sendSpontaneousEvent(QObject*, QEvent*) + 172
28  QtGui                         	       0x1042db174 QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) + 2032

On Linux, I also got some warnings and a segfault.

  • ASSERT (krita): "!m_d->dummiesList.contains(dummy)" in file /builds/graphics/krita/plugins/dockers/animation/timeline_node_list_keeper.cpp, line 191
  • WARNING: TimelineFramesModel::slotCurrentNodeChanged: node not found!
QAbstractItemModel::endInsertRows:  Invalid index ( 2 , 0 ) in model KisAnimTimelineFramesModel(0x55cd4a975480)
Segmentation fault

Other observations of issues compared to Qt6.8.

Actual bugs:
Since Qt6.9:

  • Selecting a font in Text Properties doesn’t work. Since MR!2509 the dropdown works, and a font can be selected, but it doesn’t update the text for some reason.
  • On macOS, the pop-up (KisResourceItemViewer) for switching between thumbnail and details view in the Resource Manager etc is cut off, so it’s impossible to switch to details view. But it’s fine on Linux (Qt6.11).
New log warnings, harmless(?) but annoying

Since Qt6.9:

  • macOS only(?). QBackingStoreDefaultCompositor: unknown combination of color spaces QColorSpace(QColorSpace::SRgb, QColorSpace::Primaries::SRgb, QColorSpace::TransferFunction::SRgb) -> QColorSpace(QColorSpace::DisplayP3, QColorSpace::Primaries::DciP3D65, QColorSpace::TransferFunction::SRgb) logged constantly when the Text Properties Docker is visible. Warning comes from our Qt patches. Easy fix, just if-def out the surface format change in KisQQuickWidget.cpp.
  • New Qt warning, lots of QObject::disconnect: wildcard call disconnects from destroyed signal.
  • New Qt warning, QMimeXMLProvider: MimeType is ambiguous between application/x-krita and application/zip when opening .kra. Problem is shared-mime-info doesn’t list .kra as a subclass of .zip, but this seems to be because there’s also a KOffice type of .kra with a different magic?
  • macOS only. New Qt warning. On exit, qt.qpa.menus: QPlatformMenuItem(0x60000adae500) does not belong to <QCocoaNSMenu:blah> spam for every KActionMenu. Probably a bug in KWidgetsAddons related to the destruction of the KActionMenu, it happens with Kate [KDE Advanced Text Editor] too.

Since 6.11:

  • On startup,
qt.qml.propertyCache.append: Member focusPolicy of the object SliderSpinBoxManipulator_QMLTYPE_76 overrides a member of the base object. Consider renaming it or adding final or override specifier
qt.qml.propertyCache.append: Member focusPolicy of the object SliderSpinBoxContentItem_QMLTYPE_67 overrides a member of the base object. Consider renaming it or adding final or override specifier

Haven’t looked into that. There are other QML warnings (binding loop property) that happen on older Qt, but this one’s new.


Tests on CachyOS, KDE

Text tool

  • the only thing to consistently crash, although that might belong more to the text tool thread
    • it’s mainly the font switcher
    • nothing in the log

Brushes & their dockers

  • everything seems to work fine on my end
  • the md5 error seems to appear for 1 material, while 2 gih images won’t load; will edit this when I can crosscheck & list all the specific materials that won’t load

Other UI stuff

  • the issue mentioned here does persist, although again, I can’t be sure if it’s Krita or Wayland messing with the input
  • couldn’t reproduce the tooltip error from freya above
  • sometimes, with the filter/filter layer popup, I can no longer move the canvas. This seems to happen totally randomly so I’d need some time to see what triggers this

Most of the other issues above I couldn’t reproduce, but I’ll try to double check later. The only thing I can confirm is that the brushes do feel more laggy, but that only was for a short while; like they’re being “loaded in” again each time that Krita gets re-opened. Less noticeable on lighter sets like Deevad’s, much more noticeable on bigger (file size-wise) sets like Memileo’s impasto. This does not happen on the krita-6.1.0-prealpha-978376309e-x86_64 appimage.

Update 07.05.26

Slightly annoyingly, can’t change the size of my right docker set. This might be a plugin issue, though, since I just (badly) ported a few for Qt6 compatibility.

So I had a bug a while back with the nixpkgs build but it was a bit unclear if it was something else nixpkgs did, or just building with Qt 6.10 ahead of the krita team testing that, so it was somewhat inconclusive (bug tracker link: https://bugs.kde.org/show_bug.cgi?id=519191)

I saw this post while trying to dig into it myself and it appears it is present in the AppImage build here too:

This should be a 5 (default unnamed group) + 3 (“Extra group”) palette, but as you can see only the first 4 rows of the default group work and none of the rows from optional groups.

It’s also super weird when I adjust the number of rows. Like if I set it to 5 + 8, then I get this:

And for another config, here’s 3 + 8: