Assigning ItemDelegates to different columns in a view



  • Hi,
    I have a QStandardItemModel and a tableView:

        QStandardItemModel *fixModel = new QStandardItemModel(this);
        ui->tableView_Fix->setModel (fixModel);
    

    I have 2 different delegates, ImageDelegate to handle the 1 column with images, and myDelegate to handle the rest of the columns.
    I try to use the following to assign the delegates to the columns:

        QStandardItemModel *fixModel = new QStandardItemModel(this);
        ui->tableView_Fix->setModel (fixModel);  
        ui->tableView_Fix->setItemDelegateForColumn (1,new myDelegate(this));
        ui->tableView_Fix->setItemDelegateForColumn(3, new ImageDelegate(this));
    

    If I use only one of the column assignments the program works. If I use both, the program stops working. Is this the right place for the setItemDelegateForColumn or it is supposed to be somewhere else?
    Thank you.



  • It is correct. I don't see any issue. Also can try not passing the this as parent to delegate. Also whether both the delegates work if you specify them individually


  • Moderators

    @gabor53 Yea I'm not sure what your parent is for the this pointer but I think @dheerendra is correct in telling you to not pass that.

    Those delegates will be reparented to the tableView_Fix object so you don't want then being set to whatever this is.

    It may not fix the issue though, but it has a small chance of it.

    Only thing I can think of besides that is your column indexes are wrong. Do you have at least 4 columns, with column #2 needing myDelegate and column #4 needing the ImageDelegate?



  • Code is correct but the two suggestions about removing the parent to the delegate are wrong.

    from http://doc.qt.io/qt-5/qabstractitemview.html#setItemDelegateForColumn

    Any existing column delegate for column will be removed, but not deleted. QAbstractItemView does not take ownership of delegate.

    So leave the this in the parent or you'll leak memory

    If I use only one of the column assignments the program works. If I use both, the program stops working.

    Could you specify "stop working" better?



  • @VRonin
    It crashes and gives a message saying unexpectedly stopped.



  • Could you post your stacktrace?



  • @VRonin
    Yes.
    1 myDelegate::createEditor mydelegate.cpp 16 0x41c31f
    2 QAbstractItemViewPrivate::editor qabstractitemview.cpp 4199 0x14f94af1
    3 QAbstractItemViewPrivate::openEditor qabstractitemview.cpp 4384 0x14f95895
    4 QAbstractItemView::edit qabstractitemview.cpp 2676 0x14f8fa8e
    5 QAbstractItemView::edit qabstractitemview.cpp 1201 0x14f8acf5
    6 QAbstractItemView::closeEditor qabstractitemview.cpp 2852 0x14f904de
    7 QAbstractItemView::qt_static_metacall moc_qabstractitemview.cpp 421 0x14f964de
    8 QMetaObject::activate qobject.cpp 3740 0x1cb5782
    9 QMetaObject::activate qobject.cpp 3602 0x1cb50a2
    10 QAbstractItemDelegate::closeEditor moc_qabstractitemdelegate.cpp 204 0x14fcec46
    11 QAbstractItemDelegatePrivate::editorEventFilter qabstractitemdelegate.cpp 477 0x14fcdf28
    12 QStyledItemDelegate::eventFilter qstyleditemdelegate.cpp 583 0x14ff872d
    13 QCoreApplicationPrivate::sendThroughObjectEventFilters qcoreapplication.cpp 1099 0x1c8ca0e
    14 QApplicationPrivate::notify_helper qapplication.cpp 3795 0x14d2fb50
    15 QApplication::notify qapplication.cpp 3181 0x14d2d24c
    16 QCoreApplication::notifyInternal2 qcoreapplication.cpp 988 0x1c8c6e7
    17 QCoreApplication::sendSpontaneousEvent qcoreapplication.h 234 0x150ac865
    18 QWidgetWindow::handleKeyEvent qwidgetwindow.cpp 656 0x14d7fe17
    19 QWidgetWindow::event qwidgetwindow.cpp 232 0x14d7e741
    20 QApplicationPrivate::notify_helper qapplication.cpp 3799 0x14d2fb70
    21 QApplication::notify qapplication.cpp 3159 0x14d2d143
    22 QCoreApplication::notifyInternal2 qcoreapplication.cpp 988 0x1c8c6e7
    23 QCoreApplication::sendSpontaneousEvent qcoreapplication.h 234 0x8f380ad
    24 QGuiApplicationPrivate::processKeyEvent qguiapplication.cpp 2016 0x8c1c0ac
    25 QGuiApplicationPrivate::processWindowSystemEvent qguiapplication.cpp 1693 0x8c1adc8
    26 QWindowSystemInterface::sendWindowSystemEvents qwindowsysteminterface.cpp 659 0x8c0cee2
    27 QWindowsGuiEventDispatcher::sendPostedEvents qwindowsguieventdispatcher.cpp 82 0x1f60569d
    28 qt_internal_proc(HWND__ *, unsigned int, unsigned int, long) *16 qeventdispatcher_win.cpp 443 0x1cd8f6a
    29 USER32!SetManipulationInputTarget 0x7466d2b3
    30 USER32!DispatchMessageW 0x7464e88a
    31 USER32!DispatchMessageW 0x7464e1e4
    32 USER32!DispatchMessageW 0x7464dfa0
    33 QEventDispatcherWin32::processEvents qeventdispatcher_win.cpp 844 0x1cda4f6
    34 QWindowsGuiEventDispatcher::processEvents qwindowsguieventdispatcher.cpp 74 0x1f605659
    35 QEventLoop::processEvents qeventloop.cpp 134 0x1c8a364
    36 QEventLoop::exec qeventloop.cpp 212 0x1c8a614
    37 QDialog::exec qdialog.cpp 552 0x14f3adfd
    38 MainWindow::on_actionFix_Friend_in_DB_triggered mainwindow.cpp 211 0x408e67
    39 MainWindow::qt_static_metacall moc_mainwindow.cpp 85 0x424813
    40 MainWindow::qt_metacall moc_mainwindow.cpp 117 0x424906
    41 QMetaObject::metacall qmetaobject.cpp 301 0x1c91322
    42 QMetaObject::activate qobject.cpp 3755 0x1cb582d
    43 QMetaObject::activate qobject.cpp 3602 0x1cb50a2
    44 QAction::triggered moc_qaction.cpp 369 0x14d24983
    45 QAction::activate qaction.cpp 1170 0x14d23c32
    46 QAction::event qaction.cpp 1098 0x14d23a14
    47 QApplicationPrivate::notify_helper qapplication.cpp 3799 0x14d2fb70
    48 QApplication::notify qapplication.cpp 3159 0x14d2d143
    49 QCoreApplication::notifyInternal2 qcoreapplication.cpp 988 0x1c8c6e7
    50 QCoreApplication::sendEvent qcoreapplication.h 231 0x8f38105
    51 QShortcutMap::dispatchEvent qshortcutmap.cpp 674 0x8c4763b
    52 QShortcutMap::tryShortcut qshortcutmap.cpp 351 0x8c46906
    53 QWindowSystemInterface::handleShortcutEvent qwindowsysteminterface.cpp 235 0x8c0b8f6
    54 QGuiApplicationPrivate::processKeyEvent qguiapplication.cpp 2002 0x8c1bfc8
    55 QGuiApplicationPrivate::processWindowSystemEvent qguiapplication.cpp 1693 0x8c1adc8
    56 QWindowSystemInterface::sendWindowSystemEvents qwindowsysteminterface.cpp 659 0x8c0cee2
    57 QWindowsGuiEventDispatcher::sendPostedEvents qwindowsguieventdispatcher.cpp 82 0x1f60569d
    58 qt_internal_proc(HWND__ *, unsigned int, unsigned int, long) *16 qeventdispatcher_win.cpp 443 0x1cd8f6a
    59 USER32!SetManipulationInputTarget 0x7466d2b3
    60 USER32!DispatchMessageW 0x7464e88a
    61 USER32!DispatchMessageW 0x7464e1e4
    62 USER32!DispatchMessageW 0x7464dfa0
    63 QEventDispatcherWin32::processEvents qeventdispatcher_win.cpp 844 0x1cda4f6
    64 QWindowsGuiEventDispatcher::processEvents qwindowsguieventdispatcher.cpp 74 0x1f605659
    65 QEventLoop::processEvents qeventloop.cpp 134 0x1c8a364
    66 QEventLoop::exec qeventloop.cpp 212 0x1c8a614
    67 QCoreApplication::exec qcoreapplication.cpp 1261 0x1c8cd69
    68 QGuiApplication::exec qguiapplication.cpp 1633 0x8c1ac2c
    69 QApplication::exec qapplication.cpp 2975 0x14d2cc0b
    70 main main.cpp 14 0x403964


  • Moderators

    @gabor53 So your mydelegate class is crashing, can we see the code for that?



  • in particular myDelegate::createEditor



  • @VRonin
    Here it is:

    #include "mydelegate.h"
    #include "imagepickbutton.h"
    #include "imagedelegate.h"
    
    
    myDelegate::myDelegate(QObject *parent):QStyledItemDelegate (parent)
    {
    }
    
    
    
    QWidget *myDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        Q_UNUSED(option);
    
        if((index.column () == 1))
            {
                QLineEdit *editor = new QLineEdit(parent);
                editor->setFrame (true);
                editor->setStyleSheet ("background-color:rgb(255,217,229)");
                editor->resize (100,20);
                editor->sizeHint ();
    
    //            connect(editor,&QLineEdit::editingFinished,this,&myDelegate::commitAndCloseEditor);
                return editor;
            }
    
        if((index.column () == 2))
            {
                QComboBox *comboEditor = new QComboBox(parent);
                comboEditor->setFrame (true);
                comboEditor->setEditable (true);
                comboEditor->setStyleSheet ("background-color:rgb(255,217,229)");
    
                QSqlQuery query_loadWhat ("SELECT What FROM What_Table ORDER BY What asc",db);
    
                while (query_loadWhat.next ())
                    {
                        QString  whatItem = query_loadWhat.value (0).toString ();
                        comboEditor->addItem (whatItem);
                    }
    
                return comboEditor;
            }
    
    
    
        if((index.column () == 3))//image
            {
    
    
                return new ImagePickButton(parent);
    
            }
    
        if(index.column () == 8)//Signed
            {
                QComboBox *comboSignedEdit = new QComboBox(parent);
                comboSignedEdit->setFrame (true);
                comboSignedEdit->setEditable (true);
    
                comboSignedEdit->setStyleSheet ("background-color:rgb(255,217,229)");
                QSqlQuery query_loadSigned ("SELECT Signedby FROM Signed_Table ORDER BY Signedby asc",db);
    
                while (query_loadSigned.next ())
                    {
                        QString  SignedItem = query_loadSigned.value (0).toString ();
                        comboSignedEdit->addItem (SignedItem);
                    }
                return comboSignedEdit;
            }
    
        if (index.column () == 9)//History
            {
                QTextEdit *historyEditor = new QTextEdit(parent);
                historyEditor->frameRect ();
                historyEditor->setStyleSheet ("background-color:rgb(255,217,229)");
                return historyEditor;
            }
    
        if(index.column () == 10) //Age
            {
                QLineEdit *editor = new QLineEdit(parent);
                editor->setFrame (true);
                editor->setStyleSheet ("background-color:rgb(255,217,229)");
                editor->resize (100,20);
                editor->sizeHint ();
                return editor;
            }
    
    
        QTextEdit *notesEditor = new QTextEdit(parent);
        notesEditor->frameRect ();
        notesEditor->setStyleSheet ("background-color:rgb(255,217,229)");
    
        return notesEditor;
    }
    
    
    void myDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        QLineEdit *edit = qobject_cast<QLineEdit*>(editor);
    
        if(edit)
            {
                edit->setText (index.model ()->data (index,Qt::EditRole).toString ());
                QVariant z(index.data (Qt::DisplayRole));
                QString text;
                text = z.toString ();
                qDebug() << "edit: " << text;
                return;
    
            }
    
        QDateEdit *dateEditor = qobject_cast<QDateEdit*>(editor);
        if(dateEditor)
            {
                dateEditor->setDate (index.model ()->data (index, Qt::EditRole).toDate ());
    
                dateEditor->setDate (QDate::fromString (index.model()->data (index,Qt::EditRole).toString (),"MM/dd/yyyy"));
    
                QVariant d(index.data (Qt::EditRole));
                qDebug() << "QVariant adoption date: " << d;
    
                ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(editor);
                Q_ASSERT(imgPick);
                imgPick->setSelectedFile(index.data(Qt::UserRole).toString());
    
                return;
            }
    
    
    
    
    
    
    
        if((index.column () == 4))//material
            {
                QComboBox *comboMaterialEdit = new QComboBox();
                comboMaterialEdit->setFrame (true);
                comboMaterialEdit->setEditable (true);
                comboMaterialEdit->setStyleSheet ("background-color:rgb(255,217,229)");
    
                QSqlQuery query_loadMaterial ("SELECT Material FROM MaterialTable ORDER BY Material asc",db);
    
                while (query_loadMaterial.next ())
                    {
                        QString  whatItem = query_loadMaterial.value (0).toString ();
                        comboMaterialEdit->addItem (whatItem);
                    }
    
                return;
            }
    
        if((index.column() == 5))//color
            {
                QComboBox *comboColorEdit = new QComboBox();
                comboColorEdit->setFrame (true);
                comboColorEdit->setEditable (true);
                comboColorEdit->setStyleSheet ("background-color:rgb(255,217,229)");
    
                QSqlQuery query_loadColor ("SELECT Color FROM ColorTable ORDER BY Color asc",db);
    
                while (query_loadColor.next ())
                    {
                        QString  whatItem = query_loadColor.value (0).toString ();
                        comboColorEdit->addItem (whatItem);
                    }
    
                return;
            }
    
        if(index.column () == 6)//Description
            {
                QTextEdit *textEditor = new QTextEdit();
                textEditor->frameRect ();
                textEditor->setStyleSheet ("background-color:rgb(255,217,229)");
    
                return;
            }
    
        if(index.column () == 7)//Date
            {
                QDateEdit *deditor = new QDateEdit();
                deditor->setDisplayFormat ("MM/dd/yyyy");
                deditor->setCalendarPopup (true);
                deditor->setStyleSheet ("background-color:rgb(255,217,229)");
    //            connect(deditor,&QDateEdit::editingFinished ,this,&myDelegate::commitAndCloseEditor );
    
                return;
            }
    
    
        QComboBox *comboEditor = qobject_cast<QComboBox*>(editor);
        if(comboEditor)
            {
                comboEditor->setCurrentText ((index.model ()->data (index, Qt::EditRole).toString ()));
            }
    
        QTextEdit *textEditor = qobject_cast<QTextEdit*>(editor);
        if(textEditor)
            {
                textEditor->setText ((index.model ()->data (index, Qt::EditRole).toString ()));
            }
    
    
    
    
    }
    
    void myDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        QSqlQuery fixquery;
        int colset = index.column ();
    
        switch(colset)
            {
            case 1://Name
            {
                QLineEdit *edit = qobject_cast<QLineEdit*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));
    
                QString fixID;
                QVariant v(updateIndex.data (Qt::DisplayRole));
                fixID = v.toString ();
                qDebug() << "FixID: " << fixID;
    
                model->setData (index,edit->text ());
                QVariant f(index.data(Qt::DisplayRole));
                QString modified;
                modified = f.toString ();
                qDebug() << "Modified: " << modified;
    
                fixquery.prepare("UPDATE Items SET Name = :Name WHERE ID = :fixID");
                fixquery.bindValue (":Name", modified);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
                break;
            }
    
            case 2://What
            {
                QComboBox *comboEdit = qobject_cast<QComboBox*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));//setting index to ID
    
                QString fixID;
                QVariant w(updateIndex.data (Qt::DisplayRole));//getting data from index location
                fixID = w.toString (); //turning index data ID from QVariant to string
                qDebug() << "FixID: " << fixID;  //getting ID
    
                QString saveWhat;
                saveWhat = comboEdit->currentText ();
                model->setData (index,saveWhat);
                QVariant ws(index.data (Qt::DisplayRole));
    
                saveWhat = ws.toString ();
                saveWhat = saveWhat.simplified ();
                qDebug() << "saveWhat: " << saveWhat;
    
                fixquery.prepare("UPDATE Items SET What = :What WHERE ID = :fixID");
                fixquery.bindValue (":What", saveWhat);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
    
                fixquery.prepare ("INSERT OR IGNORE INTO What_Table (What)"
                                  "VALUES(:What)");
                fixquery.bindValue (":What",saveWhat);
                fixquery.exec ();
                break;
            }
            case 3: //image
            {
    
    
    
    
    
    
    
    
    
                break;
            }
            case 4://material
            {
                QComboBox *comboMat = qobject_cast<QComboBox*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));//setting index to ID
    
                QString fixID;
                QVariant w(updateIndex.data (Qt::DisplayRole));//getting data from index location
                fixID = w.toString (); //turning index data ID from QVariant to string
                qDebug() << "FixID: " << fixID;  //getting ID
    
                QString saveMat;
                saveMat = comboMat->currentText ();
                model->setData (index,saveMat);
                QVariant mat(index.data (Qt::DisplayRole));
                saveMat = mat.toString ();
                saveMat = saveMat.simplified ();
                qDebug() << "saveMat: " << saveMat;
    
                fixquery.prepare("UPDATE Items SET Material = :Material WHERE ID = :fixID");
                fixquery.bindValue (":Material", saveMat);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
    
                fixquery.prepare ("INSERT OR IGNORE INTO MaterialTable (Material)"
                                  "VALUES(:Material)");
                fixquery.bindValue (":Material",saveMat);
                fixquery.exec ();
    
                break;
            }
            case 5://color
            {
                QComboBox *comboColor = qobject_cast<QComboBox*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));//setting index to ID
    
                QString fixID;
                QVariant w(updateIndex.data (Qt::DisplayRole));//getting data from index location
                fixID = w.toString (); //turning index data ID from QVariant to string
                qDebug() << "FixID: " << fixID;  //getting ID
    
                QString saveColor;
                saveColor = comboColor->currentText ();
                model->setData (index,saveColor);
                QVariant mat(index.data (Qt::DisplayRole));
                saveColor = mat.toString ();
                saveColor = saveColor.simplified ();
                qDebug() << "saveMat: " << saveColor;
    
                fixquery.prepare("UPDATE Items SET Color = :Color WHERE ID = :fixID");
                fixquery.bindValue (":Color", saveColor);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
    
                fixquery.prepare ("INSERT OR IGNORE INTO ColorTable (Color)"
                                  "VALUES(:Color)");
                fixquery.bindValue (":Color",saveColor);
                fixquery.exec ();
    
                break;
            }
            case 6: //description
            {
                QTextEdit *tedit = qobject_cast<QTextEdit*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));
    
                QString fixID;
                QVariant v(updateIndex.data (Qt::DisplayRole));
                fixID = v.toString ();
                qDebug() << "FixID: " << fixID;
    
                QString descString;
                descString = tedit->toPlainText ();
                model->setData (index,descString);
                QVariant desc(index.data(Qt::DisplayRole));
                QString DescModified;
                DescModified = desc.toString ();
                qDebug() << "Description: " << DescModified;
    
                fixquery.prepare("UPDATE Items SET Description = :Description WHERE ID = :fixID");
                fixquery.bindValue (":Description", DescModified);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
                break;
            }
            case 7://date
            {
    
                QDateEdit *dateEdit = qobject_cast<QDateEdit*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));
    
                QString fixID;
                QVariant v(updateIndex.data (Qt::DisplayRole));
                fixID = v.toString ();
                qDebug() << "FixID: " << fixID;
    
                model->setData (index,dateEdit->date ().toString ("MM/dd/yyyy"),Qt::EditRole);
                QVariant d(index.data (Qt::EditRole));
                QString modDate;
                modDate = d.toString ();
                qDebug() << "modDate: " << modDate;
    
                fixquery.prepare("UPDATE Items SET AdoptDate = :AdoptDate WHERE ID = :fixID");
                fixquery.bindValue (":AdoptDate", modDate);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
    
                break;
            }
            case 8://Signed by
            {
                QComboBox *comboSigned = qobject_cast<QComboBox*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));//setting index to ID
    
                QString fixID;
                QVariant w(updateIndex.data (Qt::DisplayRole));//getting data from index location
                fixID = w.toString (); //turning index data ID from QVariant to string
                qDebug() << "FixID: " << fixID;  //getting ID
    
                QString saveSigned;
                saveSigned = comboSigned->currentText ();
                model->setData (index,saveSigned);
                QVariant sign(index.data (Qt::DisplayRole));
                saveSigned = sign.toString ();
                saveSigned = saveSigned.simplified ();
                qDebug() << "saveMat: " << saveSigned;
    
                fixquery.prepare("UPDATE Items SET Signed = :Signed WHERE ID = :fixID");
                fixquery.bindValue (":Signed", saveSigned);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
    
                fixquery.prepare ("INSERT OR IGNORE INTO Signed_Table (Signedby)"
                                  "VALUES(:Signedby)");
                fixquery.bindValue (":Color",saveSigned);
                fixquery.exec ();
    
                break;
            }
            case 9://History
            {
                QTextEdit *histEdit = qobject_cast<QTextEdit*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));
    
                QString fixID;
                QVariant v(updateIndex.data (Qt::DisplayRole));
                fixID = v.toString ();
                qDebug() << "FixID: " << fixID;
    
                QString histString;
                histString = histEdit->toPlainText ();
                model->setData (index,histString);
                QVariant hist(index.data(Qt::DisplayRole));
                QString histModified;
                histModified = hist.toString ();
                qDebug() << "History: " << histModified;
                qDebug() << "Db connection names (history):" << db.connectionName ();
    
                fixquery.prepare("UPDATE Items SET History = :History WHERE ID = :fixID");
                fixquery.bindValue (":History", histModified);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
                break;
            }
            case 10://Age
            {
                QLineEdit *edit = qobject_cast<QLineEdit*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));
    
                QString fixID;
                QVariant v(updateIndex.data (Qt::DisplayRole));
                fixID = v.toString ();
                qDebug() << "FixID: " << fixID;
    
                model->setData (index,edit->text ());
                QVariant a(index.data(Qt::DisplayRole));
                QString modAge;
                modAge = a.toString ();
                qDebug() << "Modified: " << modAge;
    
                fixquery.prepare("UPDATE Items SET Age = :Age WHERE ID = :fixID");
                fixquery.bindValue (":Age", modAge);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
                break;
            }
            case 11: //notes
            {
                QTextEdit *noteEdit = qobject_cast<QTextEdit*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));
    
                QString fixID;
                QVariant v(updateIndex.data (Qt::DisplayRole));
                fixID = v.toString ();
                qDebug() << "FixID: " << fixID;
    
                QString noteString;
                noteString = noteEdit->toPlainText ();
                model->setData (index,noteString);
                QVariant n(index.data(Qt::DisplayRole));
                QString noteModified;
                noteModified = n.toString ();
                qDebug() << "History: " << noteModified;
    
                fixquery.prepare("UPDATE Items SET Notes = :Notes WHERE ID = :fixID");
                fixquery.bindValue (":Notes", noteModified);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
                break;
    
            }
            }
    
    }
    
    void myDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        Q_UNUSED(index);
    
        editor->setGeometry (option.rect);
    }
    
    QSize myDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        Q_UNUSED(option);
    
        QVariant value = index.data(Qt::SizeHintRole);
    
    
    }
    
    void myDelegate::commitAndCloseEditor()
    {
        qDebug() << "Commit and close works!";
        QLineEdit *editor = qobject_cast<QLineEdit*>(sender());
    
        emit commitData(editor);
        emit closeEditor(editor);
    
        QDateEdit *deditor = qobject_cast<QDateEdit*>(sender ());
        emit commitData (deditor);
        emit closeEditor (deditor);
    
    }
    
    QByteArray myDelegate::getNewPix()
    {
        {
            qDebug() << "Entered getNewPix!";
            QString sPath = "C:/";
    
            //    fileDialog = getOpenFileName (Q_NULLPTR,sPath);
    
    
            const QString fileName = QFileDialog::getOpenFileName(Q_NULLPTR,
                                     tr("Finding Friend's replacement Image"),sPath, tr("Image Files (*.png *.jpg *.bmp)"));
    
    
            if(fileName == "")
                {
                    qDebug() << "No image was chosen.";
                }
            else
                {
                    qDebug() << "Image was chosen!";
                }
    
            QFile file(fileName);
    
        }
    
    }
    
    QString myDelegate::getText()
    {
        QString Test;
        Test = "This is a test!";
        return Test;
    }
    

  • Moderators

    @gabor53 I don't see anything obvious in the code. It looks ok.

    What does the debugger say as you step through that createEditor? Is your pointer to parent ok? Not null? Points at a valid QObject? You reference index, is index.isValid() true?

    Exactly what line does it crash on in the debugger?



  • if(index.column()== inside a delegate is always bad design. could you step through with a debugger to see where it breaks? could you also post the constructor of ImagePickButton?



  • @VRonin
    I deleted the build folder and reran qmake and build. Now the program crashes and gives a SIGSEGV error when execution reaches this section of the code:

     case 4://material
            {
                QComboBox *comboMat = qobject_cast<QComboBox*>(editor);
                QModelIndex updateIndex(index.model ()->index(index.row (),0,index.parent ()));//setting index to ID
    
                QString fixID;
                QVariant w(updateIndex.data (Qt::DisplayRole));//getting data from index location
                fixID = w.toString (); //turning index data ID from QVariant to string
                qDebug() << "FixID: " << fixID;  //getting ID
    
                QString saveMat;
                saveMat = comboMat->currentText ();
                model->setData (index,saveMat);
                QVariant mat(index.data (Qt::DisplayRole));
                saveMat = mat.toString ();
                saveMat = saveMat.simplified ();
                qDebug() << "saveMat: " << saveMat;
    
                fixquery.prepare("UPDATE Items SET Material = :Material WHERE ID = :fixID");
                fixquery.bindValue (":Material", saveMat);
                fixquery.bindValue (":fixID",fixID);
                fixquery.exec ();
    
                fixquery.prepare ("INSERT OR IGNORE INTO MaterialTable (Material)"
                                  "VALUES(:Material)");
                fixquery.bindValue (":Material",saveMat);
                fixquery.exec ();
    
                break;
            }
    

    It stops at this line:

    saveMat = comboMat->currentText ();
    

    Where should if(index.column()== go?
    Thank you.


  • Moderators

    @gabor53 More than likely comboMat is invalid at that point. Either it's null or a dangling pointer. Or it was an uninitialized one.

    Either way it's a bad pointer. Confirm in the debugger then dig through your code to find out why.



  • @dheerendra said in Assigning ItemDelegates to different columns in a view:

    It is correct. I don't see any issue. Also can try not passing the this as parent to delegate. Also whether both the delegates work if you specify them individually


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.