Was ist der beste Weg, um eine Tableview Zellen nach oben und unten-Taste gedrückt Zustände in Qt zu machen?
-
13-09-2019 - |
Frage
Ich versuche, die Zellen eines QTableView
wie 3D-klickbaren Tasten aussehen. So dass, wenn Sie auf eine Zelle klicken, die Taste gedrückt aussieht. Jeder scheint zu denken, ich will nur die Farbe ändern, muß ich Bilder von einer normalen Taste zeigen, und einer gedrückten Taste, die 3-dimensionale aussehen.
Ich habe dies bereits getan mit QTableView::setItemDelegate()
Aufruf, mit einem geeigneten ItemDelegate
, die den Hintergrund der Zelle ändert sich, wenn es angeklickt wird. Allerdings bin ich an dieser Stelle stecken, weil ich einige Zellen will verschiedene farbige Tasten auf der Grundlage der Daten sein, die sie enthalten. So eine Zelle mit einer geringen Anzahl ein roter Knopf sein würde, das ist auch rot, wenn es angeklickt, und die anderen Zellen würden verschiedene Farben sein.
kann ich die Farbe der Schaltfläche mit dem TableModel
gesetzt, aber sobald die Schaltfläche geklickt wird, gibt es keine Möglichkeit für die ItemDelegate
zu wissen, dass es eine andere Farbe als der Rest sein soll ist. Wie können Sie verbinden die beiden so die ItemDelegate
weiß, welche Farbe es sein soll?
Auch ist es einfach eine bessere Art und Weise Zellen wie Knöpfe aussehen zu lassen?
Lösung
können Sie rufen QModelIndex::model()
aus der ItemDelegate
Methode des paint()
, da es einen QModelIndex
Parameter hat. Dies gibt Ihnen die TableModel
für die Daten, die Sie programmatisch entscheiden können, welche Farbe der Schaltfläche Zelle wird.
Dies ist jedoch noch nicht so elegant wie ich hoffe würde. Kennt jemand einen besseren Weg, um das Aussehen von Tabellenzellen zu ändern, wenn sowohl die Aufwärts- und Abwärtstastendruck Zustände?
Andere Tipps
Warum Sie nicht über den Index für die Hintergrundfarbe gefragt.
So etwas ...
QStyleOptionToolButton buttonOption;
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option);
//...
buttonOption.palette.setBrush( QPalette::Button, index.data( Qt::BackgroundColorRole ) );
//...
Ich habe das Gefühl, dass es ein Fehler in Qt und das gewesen sein muss ...
// model code
if(role==Qt::BackgroundColorRole )
return qvariant_cast<QBrush>( QBrush(Qt::red) );
// delegate code
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );
Da die optionV4.backgroundBrus
h korrekt in der sizeHint
Methode ist aber in der paint
Methode ungültig. Ich sehe jetzt Grund, warum die sizeHint
den Hintergrund Pinsel haben sollte und die paint
Methode nicht. Ich werde es Nokia melden.
EDIT:
Sieht aus wie ich richtig und es ist ein Fehler in
Können Sie nicht bekommen die ID / Zeilenanzahl in der Zeile der Tabellenzelle und überprüfen Sie es dann gegen die Farbtabelle, die Sie haben können, und stellen Sie die Farbe entsprechend? Ich bin nicht sicher, ob ich verstand Ihre Frage gut ist oder nicht.
Weisen Sie eine Daten Rolle für die Hintergrundfarbe und in Ihrem Artikel delegieren, fragen Sie den Modellindex, was es Hintergrundfarbe (mit data( bg_color_role )
oder so ähnlich). Dann in Ihrem Modell, müssen Sie die Daten Funktion stellen Sie sicher, eine Farbe für die bg_color_role
zurückgibt, die geeignet ist, für die Daten modelliert wird.
Die Art und Weise, das zu tun ist, um die Daten Methode des QModelIndex Objekts, das Sie auf der Lack-Methode zur Auswahl zu haben, und fragen Sie nach einer bestimmten Rolle (wenn Sie ein benutzerdefiniertes Modell zu definieren, können Sie Ihre eigenen Rollen hinzufügen, und geben Sie die Informationen Sie müssen die Delegierten in diesen Rollen.)
TIMW, ich glaube, Sie QStyleOptionViewItemV4 Info zu füllen, indem initStyleOption Aufruf vor.
Ich bin mir nicht sicher, wo die Voraussetzung für ein Hintergrundbild herkommt. Wenn Sie die Zellen wie QPushButton
s aussehen wollen, sollten Sie wahrscheinlich von QItemDelegate
erben und implementieren paint()
QStyle
verwenden Sie einen QPushButton
zu ziehen, so etwas wie folgt aus:
QStyleOptionButton opt;
// fill 'opt' from the information from the model, and the style option that's passed in
style()->drawControl( QStyle::CE_PushButton, &opt, painter );
Haben Sie versucht, benutzerdefinierte Stylesheets?
Sie könnten nur die gleiche Sheet für jede Zelle, anwenden und dann das Hintergrundbild / Stil ändern sich die 3D-Taste Bilder je nach zu ziehen, ob oder nicht, es ausgewählt.