Seite 1 von 1

Methoden eines benutzerdefinierten Delegates aufrufen

Verfasst: 27. April 2007 19:20
von Kai_002
hallo,

ich versuche schon seit einiger Zeit die in einem QTreeWidget enthaltenen QTreeWidgetItems zu formatieren. (Teile der dargestellten Strings sollen fett hervorgehoben werden)

Hierfür habe ich von der Klasse QItemDelegate eine Klasse abgeleitet und die Methoden

Code: Alles auswählen

QWidget * QItemDelegate::createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const
void QItemDelegate::setEditorData ( QWidget * editor, const QModelIndex & index ) const
void QItemDelegate::setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const
void QItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
und den Konstruktor überschrieben.
Um zu prüfen inwieweit die Methoden aufgerufen werden (der Debugger funktioniert komischerweise nicht bzw. die Haltepunkte werden ignoriert), habe ich an den Anfang der Funktionsrümpfe jeweils den folgenden Ausdruck gesetzt.

Code: Alles auswählen

std::cout << "\n Methode 'Methodenbezeichner' wurde aufgerufen" << std::endl;

Bis auf den entsprechenden Ausdruck im Konstruktor erfolgt im Ausgabefenster keine Ausgabe. Weshalb ich mal davon ausgehe dass die Methoden nicht durchlaufen worden sind.
Der "Startpunkt" meines Delegates befindet sich im folgenden Codefragment. Könnte ich hierbei etwas vergessen haben :?:

Code: Alles auswählen

CTreeCompareWidget::CTreeCompareWidget(QWidget *parent)
: QTreeWidget(parent)
{
	//...		
	CTreeWidgetDelegate delegate(0);
	this->setItemDelegate(&delegate);
Die Dokumentation und die Beispiele habe ich mir schon mehrfach angesehen. Aber 100-prozentig verstanden habe ich sie mit Sicherheit noch nicht.
Im Gegensatz zu meinem Vorhaben wird in der Dokumentation das benutzerdefinierte Delegate bzw. seine Methoden aufgrund einer Benutzereingabe aufgerufen. Bei mir sollen die Items jedoch bereits bei ihrer Erstellung formatiert werden, was die Sache ja eigentlich vereinfachen müsste. Das Problem scheint nun aber das Fehlen eines Einstiegspunktes für die Formatierung über den Delegate zu sein - oder sehe ich das falsch :?:

Danke
Kai

Verfasst: 27. April 2007 19:50
von upsala
Du hast kein Problem mit Qt sondern mit C++-Grundlagen. Wie lange denkst du, daß dein 'delegate' lebt?

Verfasst: 27. April 2007 20:22
von Kai_002
na o.k., kleiner Lappsus :oops:

so ist es wohl besser ...

Code: Alles auswählen

this->setItemDelegate(new CTreeWidgetDelegate(0));

Verfasst: 27. April 2007 20:39
von upsala
Und so wäre es noch besser:

Code: Alles auswählen

setItemDelegate(new CTreeWidgetDelegate(this));

Verfasst: 27. April 2007 20:58
von Kai_002
gut - Danke für deine Hinweise

erste kleine Fortschritte

Verfasst: 29. April 2007 21:14
von Kai_002
hallo,

ich habe mich mal wieder mit meinem kleinen Projekt beschäftigt, die in einem QTreeWidget dargestellten Items zum Teil fett darzustellen. So langsam sind auch erste Erfolge zu sehen - aber so richtig funktioniert es noch nicht. Die folgende Methode rufe ich in der pain-Methode in der von QItemDelegate abgeleiteten Klasse auf. Ihr übergebe ich die Parameter die paint(...) sebst erhalten hat. Zusätzlich übergebe ich die Spalte in der sich die zu editierenden Werte der Items befinden als int.

Code: Alles auswählen

void CTreeWidgetDelegate::highlightDifferents(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index, int highlightColumn) const
{
	    CTreeWidgetCompareItem* editItem = this->pmEditWidget->itemFromIndex(index); //"holen" des zu editierenden Items

    	QTextDocument* editDoc = new QTextDocument(editItem);

    	QString editText = editItem->text(highlightColumn);

    	editText = "<b>" + editText + "</b>" + "schmal" + "<b>" + "fett" + "</b>"; //sieht erstmal nur zu Testzwecken so aus

    	editDoc->setHtml(editText);

    	editDoc->drawContents(painter, option.rect);
}
Das Ergebnis dieses Codes ist, dass das erste Item gerendert angezeigt wird. Allerdings befindet sich der Text zum Teil hinter dem Symbol zum auf- und zuklappen des QTreeWidgetItems. Die automatische Einrückung nach rechts ist also verloren gegangen.
Ein anderes Phänomen ist, dass die anderen Items der Baumstruktur erst dann sichbar werden wenn man den vertikalen Schieberegler nach unten und dann wieder nach oben schiebt. Die dann nicht mehr verdeckten Items werden dann editiert dargestellt - allerdings sind sie ähnlich wie das oberste Item, nicht nach rechts eingerückt. Außerdem verschwinden alle Items bis auf das erste wenn man in eine andere Anwendung klickt (bzw. íhr Inhalt wird nicht mehr angezeigt)

Um diese Probleme zu lösen habe ich versucht die Methode drawDisplay(...) zu verwenden, da hier die Darstellung selbst funktioniert, allerdings werden die html-tags nicht verarbeitet. Bei den Parametern von drawDisplay(...) habe ich keine Möglichkeit gefunden um dies zu ändern.

O.k., aber um den Beitrag nicht noch länger werden zu lassen, schnell meine Fragen. Sieht jemand den Fehler, bzw. wo könnte er liegen :?: (ein oder zwei erklärende Sätze wären auch sehr nett :? )
Liege ich damit richtig, das ich die Methoden createEditor(...), setEditorData(...) und setModelData(...) nicht überschreiben muss, oder liegt darin bereits der Fehler :?: (aufgerufen werden sie zumindest nicht und an den darzustellenden Daten änderst sich auch nichts)

Danke
Kai

Verfasst: 29. April 2007 22:03
von upsala
Schau dir mal an, was drawContents für ein Rect verwendet und was für eins bei den Optionen übergeben wird...

Verfasst: 1. Mai 2007 20:47
von Kai_002
Bei den Optionen wird ein QRect übergeben, während drawContent(...) QRectF verwendet. Damit arbeitet drawContent(...) also mit weinger genauen Werten als ich eigentlich zur Verfügung habe. (warum ist der verkehrte Typ eigentlich nicht schon beim compilieren beanstandet worden?)

Eine Möglichkeit dass trotzdem meine genaueren Originaldaten zur Darstellung des Inhalts verwendet werden existiert nicht?

Danke
Kai

Verfasst: 1. Mai 2007 21:53
von upsala
Es geht nicht darum, wie genau die Positionen sind, sondern wo. Aber das müßte dir ja schon aufgefallen sein, daß es um mehr als 1 Pixel fehlt...

Verfasst: 1. Mai 2007 22:20
von Kai_002
Ja, na klar habe ich gemerkt dass die darzustellenden Strings nicht da sind wo sie hin sollen - nämlich da wo sie mit dem Aufruf von drawDisplay(...) stehen würden (nur ebend gerendert)

Was meinst du denn genau damit, das es darum geht wo die Positionen sind?

Danke
Kai