QTableView. Nur erste Spalte so selektierbar sein



  • Hi zusammen!

    Ich bin leider ein Anfänger im Bereich der GUI-Entwicklung in Qt.
    Habe in meiner GUI eine TableView eingebaut. Als Model, habe ich QDirModel genommen.
    Die Verzeichnisse sowie ihre Größen und weitere Eigenschaften werden angezeigt.

    Nun möchte ich, dass der User die Möglichkeit besitzt auf einen Ordner zu klicken und diesen zu öffnen...
    Problem => Ich kriege es nicht hin, dass nur die ERSTE Spalte meiner TableView Selektierbar ist.

    Was muss ich tun, damit nur die erste Spalte selektierbar ist? bzw. Wie greife ich auf die Spalten zu?

    Verzeiht mir wenn ich Forenregeln missachte. Ist mein erster Post.

    Danke im Vorraus!



  • Falls es dir ausreicht, wenn der User nur eine Zeile selektieren darf, so kannst du das bequem im Designer unter "selectionBehavior" einstellen (auf "SelectRows" stellen).

    Möchtest du tatsächlich, dass immer nur ein Element aus der ersten Spalte selektiert werden soll, so fällt mir gerade nur die Möglichkeit ein, ein eigenes SelectionModel zu schreiben, d. h. du machst dir eine neue Klasse, welche von QItemSelectionModel erbt, in etwa so:
    @class MySelectionModel : public QItemSelectionModel
    {
    Q_OBJECT
    public:
    MySelectionModel(QAbstractItemModel *model, QObject *parent = 0);

    void doSelect(const QModelIndex &idx);
    

    public slots:
    void select(const QModelIndex & index, QItemSelectionModel::SelectionFlags command);
    void select(const QItemSelection & selection, QItemSelectionModel::SelectionFlags command);

    };@

    Die select Methoden (welche normalerweise die Selektierung vornehmen) kannst du leer lassen:
    @void MySelectionModel::select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command)
    {
    //Do nothing here
    }

    void MySelectionModel::select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command)
    {
    //Do nothing here
    }@

    In der Methode doSelect, bestimmst du dann, wie deine spezielle Selektierung auszusehen hat, z. B. in etwa so (ungetestet)
    @void MySelectionModel::doSelect(const QModelIndex &idx)
    {
    if(idx.column() != 0){
    return;
    }

    //Allows onlye one item to be selected at a time
    //Click selects if unselected and deselects if selected
    //Change it if you do not wish this behavior
    QItemSelection selektion;
    QItemSelectionRange range(idx, idx);
    selektion.append(range);
    
    if(isSelected(idx))
    {
        //Call parents select function
        QItemSelectionModel::select(selektion, QItemSelectionModel::Deselect);
    }
    else
    {
        QItemSelectionModel::select(selektion, QItemSelectionModel::Select);
    }
    

    }@

    Überschreibe dann noch für deine TableView den *_clicked slot und rufe dort deine doSelect(idx) auf.
    Und natürlich musst du dein spezielles SelectionModel noch bei der TableView anmelden.

    Keine Ahnung, ob das eine wahnsinig elegante Art und Weise ist, aber ich hatte so etwas ähnliches mal verwendet, als ich meine eigene Selektierungsregel haben wollte und das war der einzige Weg, wie es dann funktionierte.

    Ach übrigens QDirModel schein deprecated zu sein, du kannst dir ja mal QFileSystemModel ansehen ;-)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.