QTableWidget Farbe einer Zelle ändern

Alles rund um die Programmierung mit Qt
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

QTableWidget Farbe einer Zelle ändern

Beitrag von JohnR »

Ich weis das Problem ist schon öfter besprochen worden, aber ich komme damit einfach nicht weiter :cry:

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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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

Code: Alles auswählen

newItem->sertBackgroundColor(Qt::red);
aufrufen sollte um zu schauen was passiert finde ich schon etwas traurig...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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() :lol:

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

Code: Alles auswählen

newItem->background() = farbe;
probiert, was auch fehlerfrei kompiliert, aber widerum keinerlei Ergebnis liefert :?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

Re: QTableWidget Farbe einer Zelle ändern

Beitrag von JohnR »

Naja die Grundlagen sind schon da so ist es nicht, aber das mit dem Background() - setBackground() ist schon ein :roll: 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
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTableWidget Farbe einer Zelle ändern

Beitrag von Christian81 »

Code: Alles auswählen

QBrush farbe;
farbe.setColor(Qt::red);
bewirkt nichts da, im Gegensatz zum ctor QBrush(QColor, QBrushStyle) der BrushStyle auf Qt::NoBrush gesetzt wird.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

Re: QTableWidget Farbe einer Zelle ändern

Beitrag von JohnR »

jepp das mit dem Brushstyle habe ich mittlerweile auch begriffen :D 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 :mrgreen:

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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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.......
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QTableWidget Farbe einer Zelle ändern

Beitrag 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.
Antworten