Mehrere, verschiedene QItemDelegates in einer TableWidget...

Alles rund um die Programmierung mit Qt
Antworten
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Mehrere, verschiedene QItemDelegates in einer TableWidget...

Beitrag von slash-ex »

Ich suche immernoch nach einer guten Lösung für mein Problem. Ich will eine funktionelle Eingabe machen und versuche für jede Spalte. Eine gewiise Anzahl an Vorauswahlen in eine Tabelle zu packen, leider kann man anscheinend nur ein Delegate pro Tabelle machen.

Gibt es da irgendeinen Ausweg, oder muss ich mehrere Tabellen erstellen?

Code: Alles auswählen

	ComboBoxDelegate *delegate_mp = new ComboBoxDelegate(0, QStringList() << "/media/" << "/windows/");
	ComboBoxDelegate *delegate_fs = new ComboBoxDelegate(0, QStringList() << "fvat" << "ntfs");
	ComboBoxDelegate *delegate_mo = new ComboBoxDelegate;
	ComboBoxDelegate *delegate_sp = new ComboBoxDelegate;
	ComboBoxDelegate *delegate_cc = new ComboBoxDelegate;

	fstab = new QTableWidget(str_hard_devices.size(), columns);	

	for(int i = 0; i < str_hard_devices.size(); i++)
	{
		for(int j = 0; j < columns; j++)
		{
			if(j == 0)
				fstab->setItemDelegate(delegate_mp);
			if(j == 1)
				fstab->setItemDelegate(delegate_fs);
			//if(j == 2)
			//	fstab->setItemDelegate(delegate_mo);
			//if(j == 3)
			//	fstab->setItemDelegate(delegate_sp);
			//if(j == 4)
			//	fstab->setItemDelegate(delegate_cc);
		}
	}
OscarWild
Beiträge: 54
Registriert: 19. Juni 2006 19:59

Beitrag von OscarWild »

Anstelle eines eigenen Delegate pro Spalte, was afaik nicht möglich ist, solltest Du ein einziges Delegate bauen, und dort anhand der beartbeiteten Zelle bzw. Spalte (geht aus dem ModelIndex hervor) unterschiedlich reagieren.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Oder die Delegates auf eine bestimmte Zeile oder Spalte mappen, sind die zwei Methoden nach setItemDelegate in der Doku.
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

ich habe einfach das beispiel spinbox-delegate umgeschrieben... ich muss zugeben, ich fand das beispiel doch schon etwas verwirrnder.... außerdem wusste ich bis vor kurzem nichtmal dass es delegates gibt.. :oops:

Code: Alles auswählen

    ComboBoxDelegate::ComboBoxDelegate(QObject *parent, QStringList list1, QStringList list2, 
			QStringList list3, QStringList list4, QStringList list5)
        : QItemDelegate(parent), strlist1(list1), strlist2(list2), strlist3(list3), strlist4(list4), strlist5(list5)
    {
    }

    QWidget *ComboBoxDelegate::createEditor(QWidget *parent,
        const QStyleOptionViewItem &/* option */,
        const QModelIndex &index) const
    {
        QComboBox *editor = new QComboBox(parent);
        editor->setEditable(true);


	if(index.column() == 0)
		if(strlist1.size() > 0)
			editor->addItems(strlist1);
	if(index.column() == 1)
		if(strlist1.size() > 0)
			editor->addItems(strlist2);
	if(index.column() == 2)
		if(strlist1.size() > 0)
			editor->addItems(strlist3);
	if(index.column() == 3)
		if(strlist1.size() > 0)
			editor->addItems(strlist4);
	if(index.column() == 4)
		if(strlist1.size() > 0)
			editor->addItems(strlist5);

        editor->installEventFilter(const_cast<ComboBoxDelegate*>(this));

        return editor;
    }

    void ComboBoxDelegate::setEditorData(QWidget *editor,
                                        const QModelIndex &index) const
    {
        QString value = index.model()->data(index, Qt::DisplayRole).toString();

        QComboBox *comboBox = static_cast<QComboBox*>(editor);
        comboBox->addItem(value);
    }

    void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                       const QModelIndex &index) const
    {
        QComboBox *comboBox = static_cast<QComboBox*>(editor);
        QString value = comboBox->currentText();

        model->setData(index, value);
    }

    void ComboBoxDelegate::updateEditorGeometry(QWidget *editor,
        const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
    {
        editor->setGeometry(option.rect);
    }
allerdings würde michdass mit dem mappen doch schon interessieren!
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Ja, macht einen ganz normalen Delegat ohne weitere Einschränkungen und nutzt : http://doc.trolltech.com/4.2/qabstracti ... eForColumn
oder : http://doc.trolltech.com/4.2/qabstracti ... gateForRow

Blöd, gibts erst ab 4.2 aber ich arbeite eigentlich nur noch mit der 4.2 API, weil da viele viele gute Dinge drinn sind, auch wenn der Snap noch absoluter Mist ist.
Antworten