Seite 1 von 1
QTableWidget + Icon
Verfasst: 23. Juli 2008 13:59
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
Verfasst: 23. Juli 2008 21:51
von upsala
Dies geht nur über ein eigenes Delegate.
Verfasst: 23. Juli 2008 22:42
von NoRulez
Hört sich kompliziert an.
Kannst Du mir ein kleines Beispiel geben was ich da tun muss?
Lg NoRulez
Verfasst: 24. Juli 2008 09:04
von upsala
Ja, die Doku zu QItemDelegate durchlesen. Dort sind jede Menge Verweise auf Beispiele...
Verfasst: 30. Juli 2008 14:03
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:
so, nun will ich aber nicht nur eines haben, sondern ein 2tes oder 3tes Icon.
ich müsste ja also dann folgendes aufrufen
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
Verfasst: 30. Juli 2008 15:39
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
Verfasst: 30. Juli 2008 18:59
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()