Search code examples
c++qtqtablewidgetitem

Getting value from QTableWidgetItem


I want to set QTableWidgetItem's data as an image. imagePath may be different each time.

QTableWidgetItem *itemMedia = new QTableWidgetItem();
itemMedia->setTextAlignment(Qt::AlignCenter);
itemMedia->setData(Qt::DecorationRole, QPixmap(imagePath).scaled(width, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation));
m_table->setItem(0,0,itemMedia);
m_table->setItem(0,1,itemMedia);
m_table->setItem(1,0,itemMedia);
m_table->setItem(1,1,itemMedia);

I've created it nicely. Next, I want to get data with this:

connect(m_table, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(onItemClicked(QTableWidgetItem *)));

void MUCSharedMedia::onItemClicked(QTableWidgetItem *item)
{
    qDebug()<<"DecorationRole: " <<item->data(Qt::DecorationRole).toString();
    qDebug()<<"DisplayRole: " <<item->data(Qt::DisplayRole).toString();
}

Actually I want imagePath in one of this role , but I get this line in Application Console:

DecorationRole:  ""
DisplayRole:  ""

How to get value? Any suggestion?

EDITED: I want to show image on each QTableWidgetItem after that I want to store image path of images which I've shown.


Solution

  • If you need to store QString actually, you need DisplayRole two times:

    itemMedia->setData(Qt::DisplayRole, imagePath);
    
    qDebug()<<"DisplayRole: " <<item->data(Qt::DisplayRole).toString();
    

    EDIT: if you need to show image and get image file path I suggest you another way:

    1) Set image like you did:

    itemMedia->setData(Qt::DecorationRole, QPixmap(imagePath).scaled(width, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation));
    

    2) Set image path using Qt::UserRole

    itemMedia->setData(Qt::UserRole, imagePath);
    

    When you need it:

    qDebug()<<"File Path: " <<item->data(Qt::UserRole).toString();
    

    But application will use image for displaying.