Seite 1 von 1

Checkbox im Delegate

Verfasst: 11. September 2008 13:24
von mcfloppy
Hallo,
hab nun mein Delegate fast fertig. Das einzige was mir fehlt ist nun die Rückgabe einer Checkbox in der painter Methode. Nur wie mache ich das?

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) {
}

void AufgabenDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                         const QModelIndex &index) const
{
	if(index.column()<12) {
		drawBackground(painter, option, index);
		  QTextDocument doc;
		  QString txt = index.data().toString();
		  if(index.column()==3) {
			  QDate date = index.data().toDate();
			  txt = date.toString("d.M.yy");
		  }
		  if(index.sibling(index.row(),3).data().toDate() <QDate::currentDate())
			  if(index.sibling(index.row(),12).data().toBool() | index.sibling(index.row(),13).data().toBool())
				  doc.setHtml("<body bgcolor=bisque>" + txt + "</body>");
			  else
				  doc.setHtml("<body bgcolor=tomato>" + txt + "</body>");
		  else if(index.sibling(index.row(),3).data().toDate() == QDate::currentDate())
			  if(index.sibling(index.row(),12).data().toBool() | index.sibling(index.row(),13).data().toBool())
				  doc.setHtml("<body bgcolor=palegreen>" + txt + "</body>");
			  else
				  doc.setHtml("<body bgcolor=chartreuse>" + txt + "</body>");
		  else
			  doc.setHtml("<body bgcolor=skyblue>" + txt + "</body>");
		  painter->save();
		  painter->translate(option.rect.topLeft());
		  QRect r(QPoint(0, 0), option.rect.size());
		  doc.drawContents(painter, r);
		  painter->restore();
		  drawFocus(painter, option, option.rect);
	} else {
		/********************************************




                                Hier Checkbox zeichnen lassen





                ********************************************/

	}
}


QWidget *AufgabenDelegate::createEditor(QWidget *parent,
		const QStyleOptionViewItem &option, const QModelIndex &index) const {
	if (index.column() == 12) {
		QCheckBox *editor = new QCheckBox(parent);
		return editor;
	} else {
		return NULL; //QItemDelegate::createEditor(parent, option, index);
	}
}

void AufgabenDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {
	if (index.column() == 12) {
		QCheckBox *checkBox = static_cast<QCheckBox*> (editor);
		if(index.data()=="true")
			checkBox->setChecked(true);
		else
			checkBox->setChecked(false);
	} else {
		QItemDelegate::setEditorData(editor, index);
	}
}

void AufgabenDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
		const QModelIndex &index) const {


	QItemDelegate::setModelData(editor, model, index);
}

void AufgabenDelegate::updateEditorGeometry(QWidget *editor,
		const QStyleOptionViewItem &option, const QModelIndex &/* index */) const {
	editor->setGeometry(option.rect);
}

Verfasst: 15. September 2008 16:09
von maxel
Qt::CheckState cs;
if(index.model()->data(index,Qt::DisplayRole).toInt()!=0)
cs=Qt::Checked;
else
cs=Qt::Unchecked;
drawCheck(painter,option,option.rect,cs);

Verfasst: 16. September 2008 10:17
von mcfloppy
Cool. das geht soweit, einziges Problem ist, das der Wechsel zwischen set und notset per einfachen Klick stattfinden soll. Im Moment sieht es ganz wild aus:
Leere Checkbox in der Mitte des Kästchens, klick ich doppelt (sprich gehe in den Editor Modus) dann kommt eine linksbündige Checkbox die ich klicken kann. Die alte mittige Checkbox bleibt weiterhin in der Mitte des Feldes, also sehe ich 2 Checkboxen und kann nur eine klicken. Wie bekomm ich das sauber hin?

Gruß Floppy

Verfasst: 17. September 2008 17:44
von mcfloppy
so habs, bin ganz frech hingegangen:

Code: Alles auswählen

void test004_filetool::on_tblAufgaben_clicked(QModelIndex index) {

	if(index.column()==12 | index.column()==13) {
		QModelIndex i = mdlAufgaben->index(index_aufgabe.row(), 12, QModelIndex());
		if(index.data().toString()=="true")
			mdlAufgaben->setData(i, "false", Qt::EditRole);
		else
			mdlAufgaben->setData(i, "true", Qt::EditRole);
		updatedbaufg();
	}
}