Простое решение - создать 2 роли, которые хранят каждую информацию, а затем использовать делегата для отображения текста в зависимости от представления:
#include <QtWidgets>
enum CustomRoles {
CounrtyRole = Qt::UserRole,
CapitalRole
};
class DisplayDelegate: public QStyledItemDelegate{
public:
DisplayDelegate(int displayRole=Qt::DisplayRole, QObject *parent=nullptr)
:QStyledItemDelegate(parent), m_displayRole(displayRole){}
int getDisplayRole() const{
return m_displayRole;
}
void setDisplayRole(int value){
m_displayRole = value;
}
protected:
void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const{
QStyledItemDelegate::initStyleOption(option, index);
QVariant value = index.data(m_displayRole);
if (value.isValid() && !value.isNull()) {
option->features |= QStyleOptionViewItem::HasDisplay;
option->text = displayText(value, option->locale);
}
}
private:
int m_displayRole;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QListWidget *country_lw = new QListWidget;
country_lw->setItemDelegate(new DisplayDelegate(CounrtyRole));
QListWidget *capital_lw = new QListWidget;
capital_lw->setItemDelegate(new DisplayDelegate(CapitalRole));
country_lw->setDragEnabled(true);
capital_lw->setAcceptDrops(true);
QListWidgetItem *item1 = new QListWidgetItem;
item1->setData(CounrtyRole, "Country1");
item1->setData(CapitalRole, "Capital1");
country_lw->addItem(item1);
QListWidgetItem *item2 = new QListWidgetItem;
item2->setData(CounrtyRole, "Country2");
item2->setData(CapitalRole, "Capital2");
country_lw->addItem(item2);
QListWidgetItem *item3 = new QListWidgetItem;
item3->setData(CounrtyRole, "Country3");
item3->setData(CapitalRole, "Capital3");
country_lw->addItem(item3);
QWidget w;
QHBoxLayout *lay = new QHBoxLayout(&w);
lay->addWidget(country_lw);
lay->addWidget(capital_lw);
w.show();
return a.exec();
}