Was ist der beste Weg, um eine Tableview Zellen nach oben und unten-Taste gedrückt Zustände in Qt zu machen?

StackOverflow https://stackoverflow.com/questions/970618

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?

War es hilfreich?

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.backgroundBrush 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 QStyleOptionViewItemV4 nicht das Symbol und backgroundBrush kopiert

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 QPushButtons 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top