Seite 1 von 1

Tabelle + delegate

Verfasst: 9. September 2008 18:24
von mcfloppy
Hi,
ich bin neu in der QT Gemeinde und habe schon direkt eine Frage :)
Also, eine MySQL Verbindung mit Anzeige in einer Tabelle aufzubauen war nicht sehr schwer. Nun brauche ich aber Checkboxen in der Tabelle. Jetzt habe ich in meinem QT4 Buch (das von Gallieo Press) gelesen, dass so etwas mit delegate lösbar wäre.
Mein Versuch dazu:
Im Konstruktor des Hauptfensters (in dem die Tabelle dargestellt wird):

Code: Alles auswählen

AufgabenDelegate delegate;
ui.tblAufgaben->setItemDelegate(&delegate);
aufgabendeglate.h

Code: Alles auswählen

/*
 * aufgabendelegate.h
 *
 *  Created on: 09.09.2008
 *      Author: mcfloppy
 */

#ifndef AUFGABENDELEGATE_H_

 #include <QItemDelegate>
 #include <QModelIndex>
 #include <QObject>
 #include <QSize>
 #include <QLineEdit>

 class AufgabenDelegate : public QItemDelegate
 {
     Q_OBJECT

 public:
	 AufgabenDelegate(QObject *parent = 0);

     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                           const QModelIndex &index) const;

     void setEditorData(QWidget *editor, const QModelIndex &index) const;
     void setModelData(QWidget *editor, QAbstractItemModel *model,
                       const QModelIndex &index) const;

     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
 };


#define AUFGABENDELEGATE_H_


#endif /* AUFGABENDELEGATE_H_ */
aufgabendeglate.cpp

Code: Alles auswählen

/*
 * aufgabendelegate.cpp
 *
 *  Created on: 09.09.2008
 *      Author: mcfloppy
 */

 #include <QtGui>

 #include "aufgabendelegate.h"
 #include <QItemDelegate>


 AufgabenDelegate::AufgabenDelegate(QObject *parent)
     : QItemDelegate(parent)
 {
 }

QWidget *AufgabenDelegate::createEditor(QWidget *parent,
     const QStyleOptionViewItem &option,
     const QModelIndex &index) const
 {
	 QLineEdit *editor = new QLineEdit(parent);
     return editor;
	 //return QItemDelegate::createEditor(parent, option, index);

 }

 void AufgabenDelegate::setEditorData(QWidget *editor,
                                     const QModelIndex &index) const
 {
	 int value = index.model()->data(index, Qt::DisplayRole).toInt();
     QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
     spinBox->setValue(value);
	 //QItemDelegate::setEditorData(editor, index);
 }

 void AufgabenDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                    const QModelIndex &index) const
 {
     QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
     spinBox->interpretText();
     int value = spinBox->value();

     model->setData(index, value);
	 //QItemDelegate::setModelData(editor, model, index);
 }

 void AufgabenDelegate::updateEditorGeometry(QWidget *editor,
     const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
 {
     editor->setGeometry(option.rect);
 }
Man sieht schon die verschiedenen Bastelleien, jedoch bleibt die Tabelle leer. Die Spalten/Zeilenbeschriftung ist weiterhin vorhanden, aber ich sehe weder Gitter noch Inhalt, sobald ich das delegate zuweise.

Könnt ihr mir weiterhelfen?

Verfasst: 9. September 2008 19:18
von mcfloppy
Ich glaub ich bin im falschen Unterforum... könnte man mich samt Beitrag verschieben? :)

Verfasst: 10. September 2008 11:06
von RHBaum
1. ja das ist falsch hier, aber die mods pennen scheinbar noch :-)

2. Du brauchst eigentlich kein eigenes delegate.
Ueberlade die QAbstractItemModel::flags() methode und mittels Qt::ItemIsUserCheckable kannst du die check funktion ein/ausschalten.

zum auslesen und setzen des Status der checkbox im QAbstractItemModel::data() und QAbstractItemModel::setData() ist die Qt::CheckStateRole zustaendig !

CheckItems darstellen koennen auch die standard Delegates, die brauchst also ned auszutauschen dafuer. Es sei denn du willst was kniffligeres.

Ciao ...

Verfasst: 10. September 2008 11:10
von mcfloppy
fehler gefunden ;) Ich hab im Slot deklariert, sprich Variable verfällt nach Abarbeitung des Slots. Nun ist des Delegate als private in der Klasse deklariert und nu gehts auch.

Verfasst: 10. September 2008 12:01
von RHBaum
Checkboxen in der Tabelle.
Checkboxen oder Spinboxen ? :-) Sehs grad erst das du ne Spinbox in deinem Code verwendest und keine checkbox !

Und grats zum eigenen Delegate :-)

Ciao ...

Verfasst: 10. September 2008 21:30
von mcfloppy
So, liebe Forengemeinde: i proudly presents the next "Stolper-stone" :)
Ich sehe zwar die Checkboxen wenn ich klicke, sprich in den Editormode gehe, aber leider nicht wenn ich auserhalb des Editormodes bin. Nun habe ich schon eine paint-Methode im delegate, da ich die BG Farbe anhand verschiedener Inhalte anpasse. Und kann ich den Editormode für verschiedene Felder verbieten? Soll ich dazu einfach bei der Methode create Editor ein Label statt einem Lineedit zurückgeben?

Gruß Floppy

Verfasst: 11. September 2008 13:19
von mcfloppy
so habs hinbekommen. ich gebe einfach NULL im delegate zurück

Verfasst: 19. Oktober 2008 10:49
von ab2cd4
Das verbieten vom editmode sollte eigentlich im Model geschehen, indem du flags(QModelIndex) selbst implementierst und dort nur für die zu bearbeitenden Felder die Editflag zurückgibst.