Seite 1 von 2
QTableWidget Farbe einer Zelle ändern
Verfasst: 14. Januar 2012 17:25
von JohnR
Ich weis das Problem ist schon öfter besprochen worden, aber ich komme damit einfach nicht weiter
Zum Problem
Mein Programm vergleicht Bilder auf dem Datenträger mit Hashwerten in einer Datenbank um duplikate zu ermitteln.
Die gefundenen Bilder sortiere ich in ein QTablewidget ein.
Bei einen Bild ohne Entsprechung in der DB soll halt ein grüner Hintergrund in die Zelle und bei positiver Entsprechung ein roter....
meine bisherigen Versuche, die ich aus verschiedenen Bsp. und Forenbeiträgen ableiten konnte
Code: Alles auswählen
QTableWidgetItem *newItem = new QTableWidgetItem(1001);
QColor red = Qt::red;
PicSearch *picWidget = new PicSearch(this);
picWidget->tableWidget->setItem(a,b,newItem)->setBackgroundColor(red);
picWidget->tableWidget->update();
setItem(a,b) a und b sind die row und columm, selbst wenn ich das aber fest auf eine existierende Zelle lege .... es kompiliert nicht obwohl der Aufbau so in ein parr Forenbsp.dargelegt wird.
Code: Alles auswählen
QTableWidgetItem *newItem = new QTableWidgetItem(1001);
newItem->setData(Qt::BackgroundRole,Qt::red);
PicSearch *picWidget = new PicSearch(this);
PicWidget->tableWidget->setItem(0,1,newItem);
kompiliert, bewirkt aber rein gar nix.
hat jemand die Müse mir ein kleines Bsp. zu geben ?
Gruß John
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 14. Januar 2012 17:52
von Christian81
Wie sollte
Code: Alles auswählen
picWidget->tableWidget->setItem(a,b,newItem)->setBackgroundColor(red);
auch kompilieren? setItem() bringt nunmal keinen Pointer auf ein QTableWidgetItem zurück. setBackGroundColor ist eine Funktion von QTableWidgetItem und außerdem noch deprecated, siehe
http://developer.qt.nokia.com/doc/qt-4. ... roundColor
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 14. Januar 2012 18:01
von JohnR
O.k das kommt davon wenn man mit 5-8 Jahre alten Bsp arbeitet.
Nachdem wir die übliche Moderatorenprozedere nun hinter uns haben.....
Jemand der sich bitte Bsp. 2 ansehen würde und Lust hätte mir etwas Hilfe zu geben?
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 14. Januar 2012 18:09
von Christian81
Ich habe es doch schon gesagt - setBackgroundColor() ist eine Funktion von QTableWidgetItem. Also was spricht dagegen es bei deinem ersten Beispiel mit dem dort erstellten QTableWidgetItem zu benutzen?
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 14. Januar 2012 21:02
von JohnR
[
Also was spricht dagegen es bei deinem ersten Beispiel mit dem dort erstellten QTableWidgetItem zu benutzen?
The following class members are obsolete. They are provided to keep old source code working. We strongly advise against using them in new code.
Der Gag an der Sache ist das Sie mir das in ihren ersten Post auch noch bewußt machen.... und jetzt fragen sie mich warum ich diese Funktion nicht benutze......
Sorry Christian81, Sie mögen sicher kompetent auf ihrem Gebiet sein, aber imho ist es so das sie hier damit nicht klarkommen das viele User lapidar "blöde" Fragen stellen.
Aber als Moderator eines solchen Forums ist und wird es nunmal so sein das sich Leute hier melden die ein Problem nicht verstanden haben und dabei etwas Anleitung brauchen wenn sie diese grundsätzlich so angehen wie ich dies leider seid ich hier Mitglied bin erleben mußte (also es gab auch mal ein bis 2 "normale" Beiträge, aber der Grunton ist einfach nur herablassend).... naja es ist halt das einzige Qt Forum in deutscher Sprache.
Fakt ist wenn ich hier in älteren Posts stöbere herrschte dort ein anderer Grundton und den Leuten wurde auch mal gern geholfen (dabei ist mir schon klar das sie dies hier freiwillig tun, das ändert aber an der Tatsache nichts das sie damit die User die hier an sie herantreten und um Hilfe Bitten nicht sofort so herablassend behandeln sollten.
Und Fakt ist auch mir erst klarzumachen das die Funktion obsolet ist (sorry das habe ich wirklich nicht bemerkt, ich habe gestern und heute sehr viele Versuche unternommen das Problem anhand von Bsp. im Netz zu abstrahieren darunter waren halt auch sehr alte Sachen aus den Jahren 2002 oder 2006 und bin danach erst an das QT Forum herangetreten)
und mich dann zu fragen was mich daran hindert diese zu nutzen
MFG John (bei mir ist es nicht nur Signaturtext)
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 15. Januar 2012 09:38
von Christian81
Nur weil eine Funktion depreacted it kann man sie doch erstmal testen und schauen ob sie tut was sie macht. Zumal in der
Doku sogar steht wie man sie sinnvoll ersetzen kann ("This function is deprecated. Use setBackground() instead.").
Ein bischen eigenständiges Handeln und Lesen setze ich schon voraus. Dass ich vorkauen muss dass man einfach mal
aufrufen sollte um zu schauen was passiert finde ich schon etwas traurig...
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 15. Januar 2012 12:49
von JohnR
so wie ich es verstanden habe, und es kann durchaus sein das ich nach ca. 10 h rumprobieren gestern nachmittag bzw. dann bis in den späten Abend irgendwo auf dem Schlauch stehe.
Code: Alles auswählen
QTableWidgetItem *newItem = new QTableWidgetItem(1001);
newItem->setBackgroundColor(Qt::red);
tableWidget->setItem(0,3,newItem);
kompiliert, führt aber zu keinen sichtbaren Ergebnis und gibt auch keinerlei Fehlermeldung aus.
dies hatte ich natürlich auch schon selbst probiert, dies führte mich dann auch zu setBackground()
Code: Alles auswählen
void QTableWidgetItem::setBackground ( const QBrush & brush )
aktuell habe ich mit QBrush mal ganz simpel folgendes probiert
Code: Alles auswählen
QBrush farbe;
farbe.setColor(Qt::red);
newItem->background(farbe);
hier ist mein denken aber anscheinend falsch
als Fehlermeldung bekomme ich
Code: Alles auswählen
no matching function for call to 'QTableWidgetItem::background(QBrush&)'
candidates are: QBrush QTableWidgetItem::background() const
aktuell habe ich dann
probiert, was auch fehlerfrei kompiliert, aber widerum keinerlei Ergebnis liefert

Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 15. Januar 2012 13:11
von Christian81
Sorry aber ein wenig C++ Grundlagen wären schon nicht schlecht...
QBrush QTableWidgetItem::background () const
Returns the brush used to render the item's background.
See also setBackground() and foreground().
Die Funktion gibt den aktuellen Background zurück! Und wenn man weiterliest sieht man sogar dass es eine Funktion setBackground() gibt...
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 15. Januar 2012 16:41
von JohnR
Naja die Grundlagen sind schon da so ist es nicht, aber das mit dem Background() - setBackground() ist schon ein

wert das gebe ich zu.....
Das ändert aber nix an der Tatsache das ein
Code: Alles auswählen
QBrush farbe;
farbe.setColor(Qt::red);
newItem->setBackground(farbe);
tableWidget->setItem(3,0,newItem);
nichts bewirkt, weder eine Fehlermeldung noch ein sichtbares Ergebnis
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 15. Januar 2012 17:36
von JohnR
o.k. ich hab jetzt ein erstes positives Ergebnis
für alle die mal das gleiche Problem haben
Code: Alles auswählen
QTableWidgetItem *item = new QTableWidgetItem(10001);
item->setBackground(QBrush(QColor(Qt::red)));
tableWidget->setItem(0,0,item);
mittels dem QBrush lassen sich dann denke ich noch alle möglichen Effekte wie Farbverläufe oder ähnliches realisieren.
Gruß John
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 15. Januar 2012 20:04
von Christian81
bewirkt nichts da, im Gegensatz zum ctor
QBrush(QColor, QBrushStyle) der BrushStyle auf Qt::NoBrush gesetzt wird.
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 16. Januar 2012 12:36
von JohnR
jepp das mit dem Brushstyle habe ich mittlerweile auch begriffen

und es gibt auch interessante Möglichkeiten die man damit realisieren kann.
von daher hat sich das längere knobeln ja gelohnt.
ein kleines Problem für Christian81`s Nervenkostüm habe ich aber noch
Wenn ich wie oben in den Bsp. schon angegeben via
Code: Alles auswählen
PicSearch *picWidget = new PicSearch(this);
QTableWidgetItem *item = new QTableWidgetItem(1001);
item->setBackground(QBrush(QColor(Qt::red)));
versuche das Tablewidget aufzurufen und die Hintergrundfarbe zu ändern bekomme ich zur Laufzeit folgende Meldung
Code: Alles auswählen
QTableWidget: cannot insert an item that is already owned by another QTableWidget
Die Fehlermeldung begreife ich schon und ich könnte sicher einfach die rows und columms in eine Funktion innerhalb meiner Picsearch.cpp zurückreichen wo ja auch das Tablewidget ursprünglich gefüllt wird....
Aber da ich dabei ja auch was lernen will....
Wie müßte der Aufruf denn realisiert werden?
und ja Christian81 es ist schon möglich das dies reine basics sind, aber leider habe ich nicht den Luxus von einer Lehrkraft oder ähnlichen bespaßt zu werden sondern muss mir das ganze selbst erarbeiten, das führt aber leider auch dazu das man ab und an Sachen falsch lernt....
Gruß John
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 16. Januar 2012 12:51
von Christian81
Ein Item doppelt setzen macht man nicht. Zuerst füllt man alle Items und später greift man per item(row, col) auf das vorher gesetzte Item zu. Denke das hier dein Fehler liegt.
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 16. Januar 2012 17:40
von JohnR
o.k. Danke für den Tipp da hätte ich ne Weile geknobelt bis ich darauf gekommen wäre.
Wenn ich Ihre Antwort versuche umzusetzen, aber denken sie an ihren Blutdruck
Code: Alles auswählen
PicWidget->tableWidget->item(a,0)->setBackground(QBrush(QColor(Qt::red)));
sollte doch eigentlich der einfachste Weg sein, führt aber zum Absturz des Programms ohne jeglichen Kommentar....
dazu habe ich noch das abstrahiert
Code: Alles auswählen
PicWidget->tableWidget->item(a,0);
item->setBackground(QBrush(QColor(Qt::red)));
PicWidget->tableWidget->editItem(item);
hier bekomme ich die Meldung zurück das der index nicht valid wäre.......
Re: QTableWidget Farbe einer Zelle ändern
Verfasst: 16. Januar 2012 17:57
von franzf
JohnR hat geschrieben:Code: Alles auswählen
PicWidget->tableWidget->item(a,0)->setBackground(QBrush(QColor(Qt::red)));
sollte doch eigentlich der einfachste Weg sein, führt aber zum Absturz des Programms ohne jeglichen Kommentar....
"Absturz ohne jeglichen Kommentar" kenn ich nicht. Irgend etwas kommt immer in die Konsole, auch wenns nur ein "Program received Signal SIGSEGV" ist. Also: In ner Console (terminal, cmd.exe, oder wie das bei dir heißt) starten und schauen was kommt. Dann weißt du erstmal WAS falsch läuft. Um zu sehen, woran es liegt, gibt es Debugger (das sind Programme und keinen netten Forenhelfer!), denn aus der Ferne kann man nichts genaues sagen.
Wenn ich raten müsste, würde ich sagen, dass an der Stelle noch gar kein Item gesetzt ist! (kann man prüfen, indem man schaut ob der von QTableWidget::item() zurückgegebene Zeiger ein NULL-Zeiger ist)
Das warning mit dem bereits gesetzten Item sagt im übrigen nur, dass dieses Item schon irgendwo in einem TableWidget gesetzt ist, nicht dass es genau an dieser Stelle schon eines gibt! Also nimmst du vllt. ein Item und setzt das immer wieder? Man kann leider auch hier nur raten, wo es genau zwickt, die Meldung (und hoffentlich die Hinweise) sollten dir aber helfen das zu finden.
Code: Alles auswählen
PicWidget->tableWidget->item(a,0);
item->setBackground(QBrush(QColor(Qt::red)));
PicWidget->tableWidget->editItem(item);
hier bekomme ich die Meldung zurück das der index nicht valid wäre.......
Weil (glücklicherweise) editItem prüft, ob das übergebene item valid ist. Im übrigen macht in dem obigen Code die erste Zeile gar nichts: Du rufst die Funktion "item()" auf, den Rückgabewert (das item in Zeile a und Spalte 0) speicherst du nicht, vor allem nicht in "item", welches dann an "editItem" übergeben wird.