Checkbox im Delegate

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

Checkbox im Delegate

Beitrag 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);
}
maxel
Beiträge: 11
Registriert: 27. Oktober 2005 08:43

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

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

Beitrag 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();
	}
}
Antworten