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.

    1. 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)
    2. 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.



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


Anmelden zum Antworten