Tabelle + delegate

Alles rund um die Programmierung mit Qt
Antworten
mcfloppy
Beiträge: 29
Registriert: 9. September 2008 17:35
Kontaktdaten:

Tabelle + delegate

Beitrag 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?
mcfloppy
Beiträge: 29
Registriert: 9. September 2008 17:35
Kontaktdaten:

Beitrag von mcfloppy »

Ich glaub ich bin im falschen Unterforum... könnte man mich samt Beitrag verschieben? :)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
mcfloppy
Beiträge: 29
Registriert: 9. September 2008 17:35
Kontaktdaten:

Beitrag 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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
mcfloppy
Beiträge: 29
Registriert: 9. September 2008 17:35
Kontaktdaten:

Beitrag 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
mcfloppy
Beiträge: 29
Registriert: 9. September 2008 17:35
Kontaktdaten:

Beitrag von mcfloppy »

so habs hinbekommen. ich gebe einfach NULL im delegate zurück
ab2cd4
Beiträge: 9
Registriert: 17. Oktober 2008 19:30

Beitrag 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.
Antworten