QAbstractTableModel - Textdarstellung
-
Hallo,
ich gebe in einer von QAbstractTableModel abgeleiteten Klassen Text aus, nicht weiter verwunderlich.Ich würde diesen Text gerne invers Ausgeben, habe leider gar nichts entsprechendes gefunden.
Über Qt::BackgroundRole kann ich ja nur die BackgroundColor für die komplette Zelle angeben.
In QFont habe ich auch keine Möglichkeit gesehen dies einzustellen.oldman
-
oldmanII schrieb:
Ich würde diesen Text gerne invers Ausgeben, habe leider gar nichts entsprechendes gefunden.
Einen String zu invertieren? Die Funktion hat man sich doch selber schnell zusammengehackt
Über Qt::BackgroundRole kann ich ja nur die BackgroundColor für die komplette Zelle angeben.
Achso, du willst die Farben invertieren
Du hast doch ForegroundRole und BackgroundRole, sollte ein leichtes sein die vertauscht in data() auszugeben, oder?
-
l'abra d'or
Einen String zu invertieren? Die Funktion hat man sich doch selber schnell zusammengehackt
Ich wüßte gar nicht wie ich da rangehen soll! Das soll so aussehen, beispielhaft an der Zahl "1" in 8*8 pixel.
Punkte sind transparent
hash ist eine beliebige Farbe`
normaler Text: inverser Text:
........ ########
....#... ####.###
...##... ###..###
..#.#... ##.#.###
....#... ####.###
....#... ####.###
....#... ####.###
........ ########
`
l'abra d'or schrieb:
Achso, du willst die Farben invertieren
Du hast doch ForegroundRole und BackgroundRole, sollte ein leichtes sein die vertauscht in data() auszugeben, oder?Ja sicher ist dies kein Problem, die bei BackgroundRole zurückgegebene Data QColor(xyz) färbt aber die ganze Zelle in dieser Farbe und nicht nur die nichtgesetzten Pixel im Zeichensatz.
oldman
-
Jetzt ist es mir klar. Bitte GENAUE Beschreibung das nächste mal gleich im Anfangspost.
- Entweder nen eigenen Delegate in der View setzen, im Delegate selber zeichnen
oder (einfacher, da fast der selbe Code nur ohne Overhead der zusätzlichen Klasse) - in der überladenen data() nicht den String zurückgeben. Render den Text stattdessen (mit korrekten Farben, versteht sich) in ein QPixmap und gib das zurück.
edit:
Mein erster Satz war eigentlich als Witz gedacht
Einen Text invertieren heißt eigentlich
otto -> otto
Ach Mist, wieder ein Witz
auto -> otua
Also einfach "von Hinten". Und sowas ist wirklich schnell selber implementiert.
- Entweder nen eigenen Delegate in der View setzen, im Delegate selber zeichnen
-
Machs mit dem pixmap. Allerdings wirst du trotzdem ein delegate brauchen, wenn du den User z.B. den Text ändern lassen willst. Das Standard-Delegate kann nichts mit Pixmaps anfangen
-
So,
hat etwas gedauert. Ich wollte mich heute ransetzen es scheint aber gar nicht zu laufen.
Wenn ich mal als Anfänger etwas weiter ausholen darf, um meine Sicht der Sache zu erleutern.
Ich möchte etwas in einer Tabelle am Bildschirm anzeigen.
Ich wähle ein QTableView und weise diesem zu:
QAbstractTableModel - in welchem die Daten gehalten werden.
QItemDelegate - spezielle Bearbeitung der Darstellung und spezielle Eingabemöglichkeiten.Ich hatte das jetzt so verstanden, daß ich in meiner Klasse myQItemDelegate die methode paint überschreiben muss um dort dann die entsprechenden Zeichenoperationen durchzuführen, wie immer dies auch gemacht wird???? Das Problem ist jetzt allerdings, daß meine paint-Methode nicht aufgerufen wird.
Muss da noch irgendetwas besonderes beachtet werden? Ich habe allerdings nichts entscprechendes in der Hilfe gefunden.Prinzipiell habe ich folgenden Code:
MyItemDelegate *delegate = new MyItemDelegate(); MyAbstractTableModel *model = new MyAbstractTableModel(); MyTableView *view = new MyTableView(); view->setModel(model); // Datenmodell setzen view->setItemDelegate(delegate); // Delegate setzen
Als nächstes die Header-Dateien
Ich habe alle Sachen welche die gespeicherten Daten betreffen erstmal rausgelassen.
Die Delegate-Klasse ist bereits in Betrieb, sie wird benutzt um einen Validator zu nutzen.
Die fehlenden virtuals kommen von meinem Vorgänger.class MyAbstractTableModel: public QAbstractTableModel { Q_OBJECT public: // Standard Konstruktor und Destruktor MyAbstractTableModel(QObject *parent = 0); ~MyAbstractTableModel(); // Methoden, die das QAbstractTableModel Interface implementieren int rowCount(const QModelIndex &parent = QModelIndex()) const ; int columnCount(const QModelIndex &parent = QModelIndex()) const ; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); }; class MyItemDelegate : public QItemDelegate { Q_OBJECT public: DoubleEditDelegate(QObject *parent = 0); // std. Konstruktor // Methoden, die das QItemDelegateInterface implementieren bool eventFilter(QObject *object, QEvent *event); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ); };
-
Warum auch immer???
Jetzt kommt der Debugger an den Breakpoint.
Habe eigentlich in dem entscheidenen Sourcebereich nichts geändert.