QTableView als view für QCombobox - Problem mit Selektion

Alles rund um die Programmierung mit Qt
Antworten
th3AddY
Beiträge: 11
Registriert: 7. Februar 2013 07:07

QTableView als view für QCombobox - Problem mit Selektion

Beitrag von th3AddY »

Hallo,

Ich habe eine QComboBox und möchte damit viele verschiedene Piktogramme auswählen können. Dafür dachte ich mir, eignet sich am besten ein QTableView. Also habe ich die Combobox folgendermaßen initialisiert:

Code: Alles auswählen

QTableView* tableView = new QTableView(this);

comboBox->setModel(new TilesModel());
comboBox->setView(tableView);

comboBox->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
comboBox->horizontalHeader()->hide();
comboBox->verticalHeader()->hide();
comboBox->resizeRowsToContents();
comboBox->resizeColumnsToContents();
TilesModel erbt von QAbstractItemModel und stellt die einzelnen Piktogamme bereit:

Code: Alles auswählen

QVariant TilesModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

	TilesModelItem* item = static_cast<TilesModelItem*>(index.internalPointer());

	if (role == Qt::DecorationRole)
		return item->getPic() // QPixmap

	if (role == Qt::ToolTipRole)
		return item->getName(); // QString

	return QVariant();
}
Es wird alles so dargestellt wie erwartet.
Das Problem ist nun, dass wenn ich ein Item in der TableView auswähle, in der ComboBox immer nur das erste Item aus der Reihe angezeigt wird. Also bei Selektion eines Items wird scheinbar nur die "row" an die ComboBox übermittelt, nicht aber die "Column".

Ich habe auch versucht, das clicked() bzw. activated() Signal der View zu nutzen. Jedoch werden sie nie ausgelöst.
Was hat es mit dem rootModelIndex() der QComboBox auf sich?

Ich wäre echt dankbar, wenn Ihr mir einen Hinweis zur Lösung des Problems geben könnt.

Viele Grüße,
Daniel
th3AddY
Beiträge: 11
Registriert: 7. Februar 2013 07:07

Re: QTableView als view für QCombobox - Problem mit Selektio

Beitrag von th3AddY »

Ich habe eine Lösung gefunden. QComboBox hat die Methode setModelColumn(int visibleColumn).

Dann einfach diese Slot-Methode an das activated(int) Signal der Combobox hängen:

Code: Alles auswählen

void TilesComboBox::slotActivated(int index)
{
	QModelIndex idx = view()->currentIndex();
	if (!idx.isValid())
		return;

	setModelColumn(idx.column());
}
Antworten