PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [QT3] Schriftfarbe in Tabellezelle ändern



Igge
21-01-2005, 17:15
Hallo!

Ich möchte die Schriftfarbe oder auch Hintergrundfarbe einer Zelle innerhalb einer QTable ändern. Den Hintergrund konnte ich bisher wie folgt ändern, allerdings wird dabei auch der Text innerhalb der Zelle überschrieben:



QRect rect = table->cellRect(0, 0);
QPixmap pix(rect.width(), rect.height());
QColor color = QColor(Qt::yellow);

pix.fill(color);
table->setPixmap(0, 0, pix);


Ich wäre dankbar, wenn mir jmd. sagen könnte, wie ich das am besten umsetze.

Igge

peschmae
21-01-2005, 18:58
Die Paint-Methode von den Zellen überschreiben?

Dieses ColorGroup Zeugs gibts irgendwie nur für die ganze Tabelle, da kann man wohl nichts für einzelne Zellen abzweigen.

MfG Peschmä

P.S. aber vorher besser noch warten bis anda_skoa hier vorbeigeguckt hat :D

anda_skoa
23-01-2005, 04:13
Innerhalb des von dir benutzen Workarounds könntest du den aktuellen Text der Zelle auslesen und entsprechend auf das Pixmap zeichnen.

Vermutlich ist aber die schon von Peschmae vorgeschlagene Lösung am besten: also von QTableItem ableiten, in paint() eine neue ColorGroup erzeugen und die Basisimplementation aufrufen.

Ciao,
_

Igge
23-01-2005, 17:10
Vielen Dank, ich hab's jetzt irgendwie (mit Hilfe der QT3-Doku) hinbekommen, verstehe aber die Funktionsweise nicht. Wie gewünscht wird nun in der Zelle (0, 0) die Schriftfarbe auf rot gesetzt. Mein Quelltext sieht jetzt wie folgt aus:

In der table.h:


class TableItem : public QTableItem {
public:
TableItem(QTable *t, EditType et, const QString &txt) : QTableItem(t, et, txt) {}
void paint(QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected);
};


in der cpp:


TableItem *item = new TableItem(table, QTableItem::Never, "test");
table->setItem(0, 0, item);

QPainter p(table);

Sowie weiter unten in der cpp:


void TableItem::paint(QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected) {
QColorGroup g(cg);

g.setColor(QColorGroup::Text, red);
QTableItem::paint(p, g, cr, selected);
}

Woher weiß QPainter, in welcher Zelle die Schritfarbe verändert wird? Und vor allem: die Funktion "paint" wird ja gar nicht aufgerufen, wie kann dann das Programm wissen, dass die Farbe rot sein soll?

Igge

peschmae
23-01-2005, 20:29
Zum zeichnen der einzelnen Zellen wird von Qt-Seite her jeweils die Paint-Methode jeder einzelnen Zelle aufgerufen wenn diese gezeichnet werden muss.
Genau die hast du jetzt abgeändert für alle nicht Q-TableItems die du erstellst, so dass halt rot gezeichnet wird. Was verstehst du da genau nicht?

MfG Peschmä

Igge
26-01-2005, 18:47
Ach so, also ruft QPainter beim Zeichnen automatisch die paint-Funktion auf....

Hab's jetzt so hinbekommen, wie ich's wollte:

.h:


class TableItem : public QTableItem {
public:
TableItem(QTable *t, EditType et, const QString &txt) : QTableItem(t, et, txt) {}
void paint(QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected);
void setColor(QColor color);

private:
QColor mycolor;
};


.cpp:


void MainWindow::setCellColor(int row, int col, QColor color) {
TableItem *item = new TableItem(table, QTableItem::Never, table->text(row, col));
table->setItem(row, col, item);
item->setColor(color);

QPainter p(table);
}


void TableItem::paint(QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected) {
QColorGroup g(cg);

g.setColor(QColorGroup::Text, mycolor);
QTableItem::paint(p, g, cr, selected);
}


void TableItem::setColor(QColor color) {
mycolor = color;
}

Zum Ändern der Schriftfarbe braucht man jetzt nur noch (z.b.)


setCellColor(2, 0, blue); aufrufen :)

Danke für die Hilfe, Igge

anda_skoa
27-01-2005, 16:42
Ach so, also ruft QPainter beim Zeichnen automatisch die paint-Funktion auf....

Nein, QTable, bzw dessen drawContents Methode :)

Ciao,
_

Igge
29-01-2005, 17:04
Nein, QTable, bzw dessen drawContents Methode :)

Ciao,
_

Gut, oder so ;)



Hab den Code nochmal etwas abgeändert, damit man auch mehrere Tabellen ansprechen kann:


void MainWindow::setCellColor(int row, int col, QTable *mytable, QColor color) {
TableItem *item = new TableItem(mytable, QTableItem::Never, mytable->text(row, col));
mytable->setItem(row, col, item);
item->setColor(color);

QPainter p(mytable);
}


setCellColor(2, 0, table, blue);

Igge

anda_skoa
30-01-2005, 14:48
Das


QPainter p(mytable);

in setCellColor ist überflüssig.

Ciao,
_