It looks like you're new here. If you want to get involved, click one of these buttons!
Hi, Matthias!
I encountered problem with QTreeWidgetItem.setBackground (both variants of calls) in 0.27.8 and 0.26.4. Sample code:
import pya
class Test_Dialog(pya.QDialog):
    def __init__(self, parent):
        super(Test_Dialog, self).__init__(parent)
        self.setWindowTitle('Test')
        self.resize(200, 200)
        vertical_layout = pya.QVBoxLayout(self)
        self.setLayout(vertical_layout)
        tree_widget = pya.QTreeWidget(self)
        header_labels = []
        for column_name in ['Column', '1', '2']:
            header_labels.append(column_name)
        tree_widget.setHeaderLabels(header_labels)
        top_level_items = []
        top_level_item = pya.QTreeWidgetItem(tree_widget)
        top_level_item.setText(0, 'Test')
        top_level_item.setCheckState(1, pya.Qt_CheckState.Checked)
        top_level_item.setCheckState(2, pya.Qt_CheckState.Unchecked)
        for column_index in range(top_level_item.columnCount()):
            # top_level_item.setBackground(column_index, pya.QBrush(pya.Qt_GlobalColor.yellow))
            top_level_item.setBackground(column_index, pya.QBrush(pya.QColor(0xFF, 0xFF, 0x00)))
        tree_widget.addTopLevelItems(top_level_items)
        tree_widget.expandAll()
        for column_index in range(tree_widget.headerItem.columnCount()):
            tree_widget.resizeColumnToContents(column_index)
        vertical_layout.addWidget(tree_widget)
def test():
    Test_Dialog(pya.Application.instance().main_window()).exec_()
Stack trace (reduced to fit forum requirements) on Ubuntu 18.04:
Signal number: 11 Address: 0x7fa2a4daf630 Program Version: KLayout 0.27.8 (2022-02-13 rcbd805f8e) Backtrace: /usr/lib/klayout/libklayout_lay.so.0 +0x2af223 lay::enable_signal_handler_gui(bool) [??:?] /lib/x86_64-linux-gnu/libc.so.6 +0x3ef10 killpg [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x2e3bf6 QBrush::QBrush(QBrush const&) [??:?] /usr/lib/klayout/libklayout_QtGui.so.0 +0xc99421 non-virtual thunk to gsi::VariantUserClass::~VariantUserClass() [??:?] /usr/lib/klayout/libklayout_pya.so.0 +0x355a7 pya::python2c_func::operator()(_object*) [??:?] /usr/lib/klayout/libklayout_pya.so.0 +0x39741 tl::Channel::operator<<(char const*) [??:?] /usr/lib/klayout/libklayout_gsi.so.0 +0x4fd09 gsi::VariantAdaptor::copy_to(gsi::AdaptorBase*, tl::Heap&) const [??:?] /usr/lib/klayout/libklayout_QtGui.so.0 +0x25d64b1 gsi::qtdecl_QTreeWidgetItem() [??:?] /usr/lib/klayout/libklayout_pya.so.0 +0x54415 pya::PythonModule::init(char const*, _object*) [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x21353b _PyCFunction_FastCallDict [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x266ff1 _PyObject_FastCallDict [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x24c1a5 PyDescr_NewMethod [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x267768 PyObject_Call [??:?] /usr/lib/klayout/libklayout_pya.so.0 +0x493d1 pya::PYAObjectBase::destroy() [??:?] /usr/lib/klayout/libklayout_QtGui.so.0 +0x25dcac2 gsi::VariantUserClass<QTreeWidgetItem>::~VariantUserClass() [??:?] /usr/lib/klayout/libklayout_QtGui.so.0 +0x25ca85a gsi::qtdecl_QTreeWidgetItem() [??:?] /usr/lib/klayout/libklayout_pya.so.0 +0x54415 pya::PythonModule::init(char const*, _object*) [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x21353b _PyCFunction_FastCallDict [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x17c1ec _PyFunction_FastCallDict [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x182303 _PyEval_EvalFrameDefault [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x17ba0f _PyEval_GetBuiltinId [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x17bd34 _PyFunction_FastCallDict [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x266fd1 _PyObject_FastCallDict [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x2676fd _PyObject_Call_Prepend [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x267768 PyObject_Call [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x1f4739 PyUnicode_Encode [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x1fc1c2 PySet_Clear [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x266f29 _PyObject_FastCallDict [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x17bec8 _PyFunction_FastCallDict [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x182303 _PyEval_EvalFrameDefault [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x17a803 _PyEval_SliceIndex [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x17c2be _PyFunction_FastCallDict [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x182303 _PyEval_EvalFrameDefault [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x17ba0f _PyEval_GetBuiltinId [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x17c4ce PyEval_EvalCodeEx [??:?] /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 +0x17d24b PyEval_EvalCode [??:?] /usr/lib/klayout/libklayout_pya.so.0 +0x2fba2 pya::PythonInterpreter::eval_string(char const*, char const*, int, int) [??:?] /usr/lib/klayout/libklayout_lym.so.0 +0x464e4 lym::Macro::run() const [??:?] /usr/lib/klayout/libklayout_laybasic.so.0 +0x26ad77 lay::Action::qaction_triggered() [??:?] /usr/lib/x86_64-linux-gnu/libQtCore.so.4 +0x19ef70 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x1bedc2 QAction::triggered(bool) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x1c0113 QAction::activate(QAction::ActionEvent) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x62236d QMenu::highlighted(int) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x626759 QMenu::internalDelayedPopup() [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x21b930 QWidget::event(QEvent*) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x62a96b QMenu::event(QEvent*) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x1c503c QApplicationPrivate::notify_helper(QObject*, QEvent*) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x1cc136 QApplication::notify(QObject*, QEvent*) [??:?] /usr/lib/klayout/libklayout_lay.so.0 +0x10b5b6 lay::GuiApplication::notify(QObject*, QEvent*) [??:?] /usr/lib/x86_64-linux-gnu/libQtCore.so.4 +0x18a8ad QCoreApplication::notifyInternal(QObject*, QEvent*) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x1cb73d QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer&, bool) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x249ddc QApplication::x11ProcessEvent(_XEvent*) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x248ce3 QApplication::x11ProcessEvent(_XEvent*) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x272592 QPaintDevice::devType() const [??:?] /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 +0x4c537 g_main_context_dispatch [??:?] /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 +0x4c770 g_main_context_dispatch [??:?] /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 +0x4c7fc g_main_context_iteration [??:?] /usr/lib/x86_64-linux-gnu/libQtCore.so.4 +0x1bb20e QEventDispatcherGlib::processEvents(QFlags) [??:?] /usr/lib/x86_64-linux-gnu/libQtGui.so.4 +0x272666 QPaintDevice::devType() const [??:?] /usr/lib/x86_64-linux-gnu/libQtCore.so.4 +0x18912f QEventLoop::processEvents(QFlags) [??:?] /usr/lib/x86_64-linux-gnu/libQtCore.so.4 +0x189495 QEventLoop::exec(QFlags) [??:?] /usr/lib/x86_64-linux-gnu/libQtCore.so.4 +0x18f459 QCoreApplication::exec() [??:?] /usr/lib/klayout/libklayout_lay.so.0 +0x10ce65 lay::GuiApplication::exec() [??:?] /usr/lib/klayout/libklayout_lay.so.0 +0x10dd87 lay::ApplicationBase::run() [??:?] /usr/bin/klayout +0x333b ?? [??:0] ... /usr/bin/klayout +0x2a4a ?? [??:0]
Comments
@EugeneZelenko Thanks for this report and the nice test case.
I can reproduce it and the problem is due to an internal loss of ownership of the QBrush object. I have created a ticket for this problem: https://github.com/KLayout/klayout/issues/1029. It will be fixed in the next minor release.
Thanks and best regards,
Matthias