QTableWidget + Icon

Alles rund um die Programmierung mit Qt
Antworten
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

QTableWidget + Icon

Beitrag von NoRulez »

Hey @all,

ich habe ein QTableWidget mit 5 Spalten. Splate 1, 3, 4, 5 sind mit Werten versehen.
In Spalte 2 will ich gerne Statussymbole einfügen. Was bei einem Symbol ja kein Problem ist:

Code: Alles auswählen

        QIcon icon(":/images/symbol.png");
	QTableWidgetItem *icon_item = new QTableWidgetItem;
	icon_item->setIcon(icon);
	icon_item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
	table->setItem(row, col++, icon_item);
Wie bewerkstellige ich es jedoch das ich 2 3 oder mehr symbole nebeneinander habe?

Lg NoRulez
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dies geht nur über ein eigenes Delegate.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Hört sich kompliziert an.

Kannst Du mir ein kleines Beispiel geben was ich da tun muss?

Lg NoRulez
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ja, die Doku zu QItemDelegate durchlesen. Dort sind jede Menge Verweise auf Beispiele...
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Ich habe mir zwar die Doku durch gelesen, stehe aber irgendwie am Schlauch.

Im moment ist es so, das ich in der betreffenden Spalte ein QTableWidgetItem habe und dessen Icon wie folgt gesetzt ist:

Code: Alles auswählen

table_item->setIcon(QIcon(':/images/test.png"));
so, nun will ich aber nicht nur eines haben, sondern ein 2tes oder 3tes Icon.

ich müsste ja also dann folgendes aufrufen

Code: Alles auswählen

table_item->setItemDelegate(MyDelegate);
Nur das Problem ist:
1.) Stimmt so meine Theorie
2.) Wie muss mein Delegate aufgebaut sein

Ich kapiere die "Delegates" nicht so ganz.

Bitte um Hilfe

Lg NoRulez
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

OK, ich denke ich habs. Mein einziges Problem was ich noch habe ist, das der Hintergrund wo mein Delegate wirkt, keine Farbe mehr hat.
hier der relevante Codeteil:

Code: Alles auswählen

 void IconDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    if (index.column() != 1) {
		QItemDelegate::paint(painter, option, index);
    } 
	else {
		QAbstractItemModel *model = (QAbstractItemModel *)index.model();
        QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) ?
            (option.state & QStyle::State_Active) ? QPalette::Normal : QPalette::Inactive : QPalette::Disabled;

        if (option.state & QStyle::State_Selected)
            painter->fillRect(option.rect, option.palette.color(cg, QPalette::Highlight));

		int state = model->data(index, Qt::DisplayRole).toInt();
		QString s1 = model->data(index, Qt::BackgroundRole).toString();

		model->setData(index, QColor(s1), Qt::BackgroundRole);		// Funktioniert nicht

		/*
		// Funktioniert auch nicht
		QBrush brush = painter->brush();
		brush.setStyle(Qt::SolidPattern);
		brush.setColor(QColor(s1));
		painter->setBrush(brush);
		*/

		int rating = 0;
		
		if(state & 1) {
			qDebug() << "Found (!)";
			rating ++;
		}
		if(state & 2) {
			qDebug() << "Found (!!)";
			rating ++;
		}
        int width = qi_warning.width();
        int height = qi_warning.height();
        int x = option.rect.x();
        int y = option.rect.y() + (option.rect.height() / 2) - (height / 2);
        for (int i = 0; i < rating; ++i) {
			if(i == 0) {
				if(state & 1)
					painter->drawPixmap(x, y, qi_info);
				else if(state & 1)
					painter->drawPixmap(x, y, qi_warning);
			}
			else if(i == 1) {
				if(state & 1)
					painter->drawPixmap(x, y, qi_warning);
			}

            x += width;
        }
        drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1)); // since we draw the grid ourselves
    }

    QPen pen = painter->pen();

    painter->setPen(option.palette.color(QPalette::Mid));
    painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
    painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
    painter->setPen(pen);
 }
Lg NoRulez
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Warum benutzt du innerhalb von paint() setData()? Dies kann im ungünstigsten Fall eine Endlosschleife auslösen.

Außerdem gibts noch die Funktion QItemDelegate::drawBackground()
Antworten