Auf dieser Seite

QRangeModel Class

QRangeModel implementiert „ QAbstractItemModel “ für jeden C++-Bereich. Mehr...

Header: #include <QRangeModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Seit: Qt 6.10
Erbt von: QAbstractItemModel

Hinweis: Alle Funktionen dieser Klasse sind reentrant.

Öffentliche Typen

(since 6.11) struct ItemAccess
(since 6.10) struct RowOptions
(since 6.11) enum class AutoConnectPolicy { None, Full, OnRead }
(since 6.12) enum class DropOperation { DontDrop, Automatic, OverwriteAndIgnore, OverwriteAndExtend, InsertAsSiblings, InsertAsChildren }
enum class RowCategory { Default, MultiRoleItem }

Eigenschaften

Öffentliche Funktionen

QRangeModel(Range &&range, QObject *parent = nullptr)
QRangeModel(Range &&range, Protocol &&protocol, QObject *parent = nullptr)
virtual ~QRangeModel() override
QRangeModel::AutoConnectPolicy autoConnectPolicy() const
void resetRoleNames()
void resetSortCollator()
void resetSortRole()
void resetSupportedDragActions()
void resetSupportedDropActions()
void setAutoConnectPolicy(QRangeModel::AutoConnectPolicy policy)
void setRoleNames(const QHash<int, QByteArray> &names)
void setSortCollator(const QCollator &collator)
void setSortRole(int role)
void setSupportedDragActions(Qt::DropActions actions)
void setSupportedDropActions(Qt::DropActions actions)
QCollator sortCollator() const
int sortRole() const

Neu implementierte öffentliche Funktionen

virtual QModelIndex buddy(const QModelIndex &index) const override
virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override
virtual bool canFetchMore(const QModelIndex &parent) const override
virtual bool clearItemData(const QModelIndex &index) override
virtual int columnCount(const QModelIndex &parent = {}) const override
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
virtual void fetchMore(const QModelIndex &parent) override
virtual Qt::ItemFlags flags(const QModelIndex &index) const override
virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const override
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
virtual QModelIndex index(int row, int column, const QModelIndex &parent = {}) const override
virtual bool insertColumns(int column, int count, const QModelIndex &parent = {}) override
virtual bool insertRows(int row, int count, const QModelIndex &parent = {}) override
virtual QMap<int, QVariant> itemData(const QModelIndex &index) const override
virtual QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const override
virtual QMimeData *mimeData(const QModelIndexList &indexes) const override
virtual QStringList mimeTypes() const override
virtual bool moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationColumn) override
virtual bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationRow) override
virtual void multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const override
virtual QModelIndex parent(const QModelIndex &child) const override
virtual bool removeColumns(int column, int count, const QModelIndex &parent = {}) override
virtual bool removeRows(int row, int count, const QModelIndex &parent = {}) override
virtual QHash<int, QByteArray> roleNames() const override
virtual int rowCount(const QModelIndex &parent = {}) const override
virtual bool setData(const QModelIndex &index, const QVariant &data, int role = Qt::EditRole) override
virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &data, int role = Qt::EditRole) override
virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &data) override
virtual QModelIndex sibling(int row, int column, const QModelIndex &index) const override
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override
virtual QSize span(const QModelIndex &index) const override
virtual Qt::DropActions supportedDragActions() const override
virtual Qt::DropActions supportedDropActions() const override

Signale

void autoConnectPolicyChanged(QRangeModel::AutoConnectPolicy policy)
void roleNamesChanged()
void sortCollatorChanged(const QCollator &collator)
void sortRoleChanged(int role)
void supportedDragActionsChanged(Qt::DropActions actions)
void supportedDropActionsChanged(Qt::DropActions actions)

Neu implementierte geschützte Funktionen

virtual bool event(QEvent *event) override
virtual bool eventFilter(QObject *object, QEvent *event) override

Geschützte Slots

virtual void resetInternalData() override

Ausführliche Beschreibung

QRangeModel kann die Daten eines beliebigen sequenziell durchlaufbaren C++-Typs für das Modell-View-Framework von Qt verfügbar machen. Dies erleichtert die Darstellung bestehender Datenstrukturen in den Elementansichten „ Qt Widgets “ und „ Qt Quick “ und ermöglicht es dem Benutzer der Anwendung, die Daten über eine grafische Benutzeroberfläche zu bearbeiten.

Um QRangeModel zu verwenden, instanziieren Sie es mit einem C++-Bereich und legen Sie es als Modell für eine oder mehrere Ansichten fest:

std::array<int, 5> numbers = {1, 2, 3, 4, 5};
QRangeModel model(numbers);
listView.setModel(&model);

Erstellen des Modells

Der Bereich kann ein beliebiger C++-Typ sein, für den die Standardmethoden ` std::begin ` und ` std::end ` implementiert sind und bei dem der zurückgegebene Iterator-Typ die Anforderung ` std::forward_iterator` erfüllt. Bestimmte Modelloperationen erzielen eine bessere Leistung, wenn ` std::size ` verfügbar ist und der Iterator die Anforderung ` std::random_access_iterator` erfüllt.

Der Bereich muss beim Erstellen des Modells angegeben werden und kann als Wert, Referenz-Wrapper oder Zeiger übergeben werden. Die Art und Weise, wie das Modell erstellt wurde, bestimmt, ob Änderungen über die Modell-API die Originaldaten modifizieren. Verwenden Sie QRangeModelAdapter, um implizit ein Modell zu erstellen und gleichzeitig direkten, typsicheren und bequemen Zugriff auf das Modell als Bereich zu erhalten.

Bei der Erstellung nach Wert erstellt das Modell eine Kopie des Bereichs, und APIs von „ QAbstractItemModel “, die das Modell ändern, wie z. B. ` setData()` oder ` insertRows()`, haben keine Auswirkungen auf den ursprünglichen Bereich.

QRangeModel model(numbers);

Änderungen an den Daten können durch Anbindung an die vom Modell ausgegebenen Signale, wie z. B. ` dataChanged()`, überwacht werden.

Damit sich Änderungen am Modell auf den ursprünglichen Bereich auswirken, übergeben Sie den Bereich entweder über einen Zeiger:

QRangeModel model(&numbers);

oder über einen Referenz-Wrapper:

QRangeModel model(std::ref(numbers));

In diesem Fall ändern QAbstractItemModel -APIs, die das Modell modifizieren, auch den Bereich. Methoden, die die Struktur des Bereichs verändern, wie z. B. insertRows() oder removeColumns(), verwenden Standard-C++-Container-APIs resize(), insert(), erase() und dereferenzieren zusätzlich einen mutierenden Iterator, um die Daten zu setzen oder zu löschen.

Hinweis: Sobald das Modell erstellt und an eine Ansicht übergeben wurde, darf der Bereich, auf den das Modell wirkt, nicht mehr direkt geändert werden. Ansichten des Modells würden nicht über die Änderungen informiert, und strukturelle Änderungen würden wahrscheinlich Instanzen von ` QPersistentModelIndex ` beschädigen, die das Modell verwaltet. Verwenden Sie ` QRangeModelAdapter `, um sicher mit dem zugrunde liegenden Bereich zu interagieren und gleichzeitig das Modell auf dem neuesten Stand zu halten.

Der Aufrufer muss sicherstellen, dass die Lebensdauer des Bereichs die Lebensdauer des Modells übersteigt.

Verwenden Sie Smart-Pointer, um sicherzustellen, dass der Bereich erst gelöscht wird, wenn alle Clients ihn nicht mehr benötigen.

auto shared_numbers = std::make_shared<std::vector<int>>(numbers);
QRangeModel model(shared_numbers);

QRangeModel unterstützt sowohl gemeinsam genutzte als auch eindeutige Zeiger.

Schreibgeschützt oder veränderbart

Für Bereiche, die „const“-Objekte sind, bei denen der Zugriff stets konstante Werte liefert oder bei denen die erforderlichen Container-APIs nicht verfügbar sind, implementiert QRangeModel Schreibzugriffs-APIs, die keine Aktion ausführen und „ false “ zurückgeben. Im Beispiel mit „ std::array “ kann das Modell keine Zeilen hinzufügen oder entfernen, da die Anzahl der Einträge in einem C++-Array feststeht. Die Werte können jedoch mit ` setData()` geändert werden, und der Benutzer kann die Bearbeitung der Werte in der Listenansicht auslösen. Indem das Array als `const` deklariert wird, werden die Werte ebenfalls schreibgeschützt.

const std::array<int, 5> numbers = {1, 2, 3, 4, 5};

Die Werte sind ebenfalls schreibgeschützt, wenn der Elementtyp `const` ist, wie in

std::array<const int, 5> numbers = {1, 2, 3, 4, 5};

In den obigen Beispielen mit ` std::vector` kann das Modell Zeilen hinzufügen oder entfernen, und die Daten können geändert werden. Wird der Bereich als konstante Referenz übergeben, wird das Modell schreibgeschützt.

QRangeModel model(std::cref(numbers));

Hinweis: Sind die Werte im Bereichals `const`definiert , ist es zudem nicht möglich, Spalten und Zeilen über die ` QAbstractItemModel `-API zu entfernen oder einzufügen. Für eine detailliertere Steuerung implementieren Sie ` the C++ tuple protocol`.

Zeilen und Spalten

Die Elemente im Bereich werden als Zeilen des Modells interpretiert. Je nach Typ dieser Zeilenelemente stellt QRangeModel den Bereich als Liste, Tabelle oder Baumstruktur dar.

Sind die Zeilenelemente einfache Werte, wird der Bereich als Liste dargestellt.

QList<int> numbers = {1, 2, 3, 4, 5};
QRangeModel model(numbers); // columnCount() == 1
QListView listView;
listView.setModel(&model);

Ist der Typ der Zeilenelemente ein iterierbarer Bereich, wie beispielsweise ein Vektor, eine Liste oder ein Array, wird der Bereich als Tabelle dargestellt.

std::vector<std::vector<int>> gridOfNumbers = {
    {1, 2, 3, 4, 5},
    {6, 7, 8, 9, 10},
    {11, 12, 13, 14, 15},
};
QRangeModel model(&gridOfNumbers); // columnCount() == 5
QTableView tableView;
tableView.setModel(&model);

Wenn der Zeilentyp die Standard-C++-Container-APIs „ resize() “, „ insert() “ und „ erase() “ bereitstellt, können Spalten über „ insertColumns()“ und „ removeColumns()“ hinzugefügt und entfernt werden. Alle Zeilen müssen die gleiche Anzahl an Spalten aufweisen.

Strukturen und Gadgets als Zeilen

Wenn der Zeilentyp ` the C++ tuple protocol` implementiert, wird der Bereich als Tabelle mit einer festen Anzahl von Spalten dargestellt.

using TableRow = std::tuple<int, QString>;
QList<TableRow> numberNames = {
    {1, "one"},
    {2, "two"},
    {3, "three"}
};
QRangeModel model(&numberNames); // columnCount() == 2
QTableView tableView;
tableView.setModel(&model);

Eine einfachere und flexiblere Alternative zur Implementierung des Tupel-Protokolls für einen C++-Typ ist die Verwendung des Metaobjekt-Systems von Qt, um einen Typ mit Eigenschaften zu deklarieren. Dabei kann es sich um einen Werttyp handeln, der als ` gadget` deklariert ist, oder um eine Unterklasse von ` QObject `.

class Book
{
    Q_GADGET
    Q_PROPERTY(QString title READ title)
    Q_PROPERTY(QString author READ author)
    Q_PROPERTY(QString summary MEMBER m_summary)
    Q_PROPERTY(int rating READ rating WRITE setRating)
public:
    Book(const QString &title, const QString &author);

    // C++ rule of 0: destructor, as well as copy/move operations
    // provided by the compiler.

    // read-only properties
    QString title() const { return m_title; }
    QString author() const { return m_author; }

    // read/writable property with input validation
    int rating() const { return m_rating; }
    void setRating(int rating)
    {
        m_rating = qBound(0, rating, 5);
    }

private:
    QString m_title;
    QString m_author;
    QString m_summary;
    int m_rating = 0;
};

Durch die Verwendung von Unterklassen von ` QObject ` können Eigenschaften gebunden werden oder über Signale zur Benachrichtigung bei Änderungen verfügen. Die Verwendung von ` QObject `-Instanzen für Elemente ist jedoch mit einem erheblichen Speicher-Overhead verbunden.

Die Verwendung von Qt-Gadgets oder -Objekten ist praktischer und kann flexibler sein als die Implementierung des Tuple-Protokolls. Auf diese Typen kann auch direkt aus QML heraus zugegriffen werden. Der Zugriff über das Eigenschaftssystem ist jedoch mit einem gewissen Laufzeitaufwand verbunden. Bei leistungskritischen Modellen sollte die Implementierung des Tuple-Protokolls zur Generierung des Zugriffscodes zur Kompilierungszeit in Betracht gezogen werden.

Elemente mit mehreren Rollen

Der Typ der Elemente, auf die die Implementierungen von ` data()`, ` setData()`, ` clearItemData()` usw. angewendet werden, kann im gesamten Modell einheitlich sein – wie im obigen Beispiel „ gridOfNumbers “. Der Bereich kann jedoch auch unterschiedliche Elementtypen für verschiedene Spalten enthalten, wie im Fall „ numberNames “.

Standardmäßig wird der Wert für die Rollen „ Qt::DisplayRole “ und „ Qt::EditRole “ verwendet. Die meisten Ansichten erwarten, dass der Wert „ convertible to and from a QString “ ist (ein benutzerdefinierter Delegat könnte jedoch mehr Flexibilität bieten).

Assoziative Container mit mehreren Rollen

Wenn es sich bei dem Element um einen assoziativen Container handelt, der „ int “, „ Qt::ItemDataRole “ oder „ QString “ als Schlüsseltyp und „ QVariant “ als zugeordneten Typ verwendet, interpretiert QRangeModel diesen Container als Speicher für die Daten mehrerer Rollen. Die Funktionen „ data()“ und „ setData()“ geben den zugeordneten Wert im Container zurück bzw. ändern ihn, „ setItemData()“ ändert alle angegebenen Werte, „ itemData()“ gibt alle gespeicherten Werte zurück und „ clearItemData()“ löscht den gesamten Container.

using ColorEntry = QMap<Qt::ItemDataRole, QVariant>;

const QStringList colorNames = QColor::colorNames();
QList<ColorEntry> colors;
colors.reserve(colorNames.size());
for (const QString &name : colorNames) {
    const QColor color = QColor::fromString(name);
    colors << ColorEntry{{Qt::DisplayRole, name},
                        {Qt::DecorationRole, color},
                        {Qt::ToolTipRole, color.name()}};
}
QRangeModel colorModel(colors);
QListView list;
list.setModel(&colorModel);

Der effizienteste Datentyp, der als Schlüssel verwendet werden kann, ist „ Qt::ItemDataRole “ oder „ int “. Bei Verwendung von „ int “ gibt „ itemData “() den Container unverändert zurück und muss keine Kopie der Daten erstellen.

Gadgets und Objekte als Elemente mit mehreren Rollen

Gadgets und „ QObject “-Typen können ebenfalls als Elemente mit mehreren Rollen dargestellt werden. Die Eigenschaften dieser Elemente werden für die Rolle verwendet, auf die die „ name of a role “ zutrifft. Wenn alle Elemente denselben Gadget- oder „ QObject “-Typ aufweisen, gibt die Implementierung von „ roleNames()“ in „QRangeModel“ die Liste der Eigenschaften dieses Typs zurück.

class ColorEntry
{
    Q_GADGET
    Q_PROPERTY(QString display READ colorName)
    Q_PROPERTY(QColor decoration READ decoration)
    Q_PROPERTY(QString toolTip READ toolTip)
public:
    ColorEntry(const QString &color = {})
        : m_colorName(color)
    {}

    QString colorName() const
    {
        return m_colorName;
    }
    QColor decoration() const
    {
        return QColor::fromString(m_colorName);
    }
    QString toolTip() const
    {
        return QColor::fromString(m_colorName).name();
    }

private:
    QString m_colorName;
};

Bei Verwendung in einer Tabelle ist dies die Standarddarstellung für Gadgets:

QList<QList<ColorEntry>> colorTable;

// ...

QRangeModel colorModel(colorTable);
QTableView table;
table.setModel(&colorModel);

Bei der Verwendung in einer Liste werden diese Typen jedoch standardmäßig als mehrspaltige Zeilen dargestellt, wobei jede Eigenschaft als separate Spalte dargestellt wird. Um zu erzwingen, dass ein Gadget in einer Liste als Element mit mehreren Rollen dargestellt wird, deklarieren Sie das Gadget als Typ mit mehreren Rollen, indem Sie `QRoleModel::RowOptions` spezialisieren und die Membervariable ` static constexpr auto rowCategory ` auf ` MultiRoleItem` setzen.

class ColorEntry
{
    Q_GADGET
    Q_PROPERTY(QString display READ colorName)
    Q_PROPERTY(QColor decoration READ decoration)
    Q_PROPERTY(QString toolTip READ toolTip)
public:
    ...
};
template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    static constexpr auto rowCategory = QRangeModel::RowCategory::MultiRoleItem;
};

Sie können solche Typen auch in ein Tupel mit einem Element verpacken, wodurch die Liste in eine Tabelle mit einer einzigen Spalte umgewandelt wird:

const QStringList colorNames = QColor::colorNames();
QList<std::tuple<ColorEntry>> colors;

// ...

QRangeModel colorModel(colors);
QListView list;
list.setModel(&colorModel);

Beachten Sie in diesem Fall, dass für den direkten Zugriff auf die Elemente in den Listendaten „ std::get “ verwendet werden muss:

ColorEntry firstEntry = std::get<0>(colors.at(0));

oder alternativ eine strukturierte Bindung:

auto [firstEntry] = colors.at(0);

Zeilen als Werte oder Zeiger

In den bisherigen Beispielen haben wir QRangeModel stets mit Bereichen verwendet, die Werte enthalten. QRangeModel kann auch mit Bereichen arbeiten, die Zeiger enthalten, einschließlich Smart-Zeiger. Dadurch kann QRangeModel mit Bereichen polymorpher Typen arbeiten, wie beispielsweise Unterklassen von ` QObject `.

class Entry : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString display READ display WRITE setDisplay NOTIFY displayChanged)
    Q_PROPERTY(QIcon decoration READ decoration WRITE setDecoration NOTIFY decorationChanged)
    Q_PROPERTY(QString toolTip READ toolTip WRITE setToolTip NOTIFY toolTipChanged)

public:
    Entry() = default;

    QString display() const
    {
        return m_display;
    }

    void setDisplay(const QString &display)
    {
        if (m_display == display)
            return;
        m_display = display;
        emit displayChanged(m_display);
    }

signals:
    void displayChanged(const QString &);
    ...
};
std::vector<std::shared_ptr<Entry>> entries = {
    ...
};
QRangeModel model(std::ref(entries));
QListView listView;
listView.setModel(&model);

Wie bei Werten bestimmt der Typ der Zeile, ob der Bereich als Liste, Tabelle oder Baum dargestellt wird. Zeilen, die QObjects sind, stellen jede Eigenschaft als Spalte dar, es sei denn, die Vorlage „ QRangeModel::RowOptions “ ist so spezialisiert, dass der Typ als Element mit mehreren Rollen deklariert wird.

template <>
struct QRangeModel::RowOptions<Entry>
{
    static constexpr auto rowCategory = QRangeModel::RowCategory::MultiRoleItem;
};
std::vector<std::shared_ptr<Entry>> entries = {
    std::make_shared<Entry>(),
    ...
};

QRangeModel model(std::ref(entries));

Hinweis: Wenn der Bereich Rohzeiger enthält, müssen Sie `QRangeModel` aus einem Zeiger oder einem Referenz-Wrapper des Bereichs konstruieren. Andernfalls wird die Eigentumsvergabe der Daten mehrdeutig, und eine Kopie des Bereichs würde weiterhin auf dieselben tatsächlichen Zeilendaten zugreifen, was zu unerwarteten Nebeneffekten führen würde.

Unterklassen von QRangeModel

Durch die Unterklassifizierung von `QRangeModel` lassen sich praktische APIs hinzufügen, die den Datentyp und die Struktur des Bereichs berücksichtigen.

class NumbersModel : public QRangeModel
{
    std::vector<int> m_numbers;

public:
    NumbersModel(const std::vector<int> &numbers)
        : QRangeModel(std::ref(m_numbers))
        , m_numbers(numbers)
    {
    }

Fügen Sie dabei den Bereich als privates Mitglied hinzu und rufen Sie den QRangeModel-Konstruktor mit einem Referenz-Wrapper oder einem Zeiger auf dieses Mitglied auf. Dadurch werden die Daten ordnungsgemäß gekapselt und ein direkter Zugriff vermieden.

    void setNumber(int idx, int number)
    {
        setData(index(idx, 0), QVariant::fromValue(number));
    }

    int number(int idx) const
    {
        return m_numbers.at(idx);
    }
};

Fügen Sie Mitgliedsfunktionen hinzu, um einen typsicheren Zugriff auf die Daten zu ermöglichen, und verwenden Sie die API „ QAbstractItemModel “, um alle Operationen durchzuführen, die den Bereich verändern. Bei schreibgeschütztem Zugriff kann direkt auf die Datenstruktur zugegriffen werden.

Datenstrukturen in Baumform

QRangeModel kann eine Datenstruktur als Baummodell darstellen. Eine solche Baumdatenstruktur muss homomorph sein: Auf allen Ebenen des Baums muss die Liste der untergeordneten Zeilen genau dieselbe Darstellung verwenden wie der Baum selbst. Zudem muss der Zeilentyp eine statische Größe haben: entweder ein „Gadget“- oder „ QObject “-Typ oder ein Typ, der ` the C++ tuple protocol` implementiert.

Um solche Daten als Baum darzustellen, muss QRangeModel in der Lage sein, die Datenstruktur zu durchlaufen: Für jede beliebige Zeile muss das Modell die übergeordnete Zeile sowie den optionalen Bereich der untergeordneten Zeilen abrufen können. Diese Durchlauffunktionen können implizit über den Zeilentyp oder über einen expliziten Protokolltyp bereitgestellt werden.

Implizites Protokoll zur Baumdurchquerung

class TreeRow;

using Tree = std::vector<TreeRow>;

Der Baum selbst ist ein Vektor aus „ TreeRow “-Werten. Siehe „ Tree Rows as pointers or values “ für Überlegungen dazu, ob für die Zeilen Werte oder Zeiger auf Elemente verwendet werden sollten.

class TreeRow
{
    Q_GADGET
    // properties

    TreeRow *m_parent;
    std::optional<Tree> m_children;

public:
    TreeRow() = default;

    // rule of 0: copy, move, and destructor implicitly defaulted

Die Zeilenklasse kann ein beliebiger der oben beschriebenen Typen mit fester Größe sein: ein Typ, der das Tupel-Protokoll implementiert, ein Gadget oder ein ` QObject`. In diesem Beispiel verwenden wir ein Gadget.

Jedes Zeilenelement muss einen Zeiger auf die übergeordnete Zeile sowie optional einen Bereich von untergeordneten Zeilen enthalten. Dieser Bereich muss mit der für den Baum selbst verwendeten Bereichsstruktur identisch sein.

Es ist optional, den Zeilentyp standardmäßig konstruierbar zu machen; dies ermöglicht es dem Modell, neue Zeilendatenelemente zu konstruieren, beispielsweise in den Implementierungen von ` insertRow()` oder ` moveRows()`.

    // tree traversal protocol implementation
    const TreeRow *parentRow() const { return m_parent; }
    const std::optional<Tree> &childRows() const { return m_children; }

Das Baumdurchlaufprotokoll kann dann als Member-Funktionen des Zeilendatentyps implementiert werden. Eine ` parentRow() `-Funktion vom Typ `const` muss einen Zeiger auf ein Zeilenelement zurückgeben; und die ` childRows() `-Funktion muss eine Referenz auf ein `const`-` std::optional ` zurückgeben, das den optionalen Bereich der untergeordneten Zeilen enthalten kann.

Diese beiden Funktionen reichen aus, damit das Modell den Baum als schreibgeschützte Datenstruktur durchlaufen kann. Damit der Benutzer Daten in einer Ansicht bearbeiten kann und das Modell mutierende Modell-APIs wie ` insertRows()`, ` removeRows()` und ` moveRows()` implementieren kann, müssen wir zusätzliche Funktionen für den Schreibzugriff implementieren:

    void setParentRow(TreeRow *parent) { m_parent = parent; }
    std::optional<Tree> &childRows() { return m_children; }

Das Modell ruft die Funktion ` setParentRow() ` und die überladene, veränderbare Version von ` childRows() ` auf, um Zeilen in einen bestehenden Baumzweig zu verschieben oder einzufügen und den Elternzeiger zu aktualisieren, falls der alte Wert ungültig geworden ist. Die nicht-konstante Überladung von ` childRows() ` bietet zusätzlich Schreibzugriff auf die Zeilendaten.

Hinweis: Das Modell führt das Festlegen des übergeordneten Elements einer Zeile, das Entfernen dieser Zeile vom alten übergeordneten Element und das Hinzufügen zur Liste der untergeordneten Elemente des neuen übergeordneten Elements als separate Schritte durch. Dadurch bleibt die Protokollschnittstelle überschaubar.

    ...
    // Helper to assembly a tree of rows, not used by QRangeModel
    template <typename ...Args>
    TreeRow &addChild(Args &&...args)
    {
        if (!m_children)
            m_children.emplace(Tree{});
        auto &child = m_children->emplace_back(std::forward<Args>(args)...);
        child.m_parent = this;
        return child;
    }
};

Der Rest der Klassenimplementierung ist für das Modell nicht relevant, aber ein Hilfsfunktion „ addChild() “ bietet uns eine bequeme Möglichkeit, den Anfangszustand des Baums zu konstruieren.

Tree tree = {
    {"..."},
    {"..."},
    {"..."},
};

// each toplevel row has three children
tree[0].addChild("...");
tree[0].addChild("...");
tree[0].addChild("...");

tree[1].addChild("...");
tree[1].addChild("...");
tree[1].addChild("...");

tree[2].addChild("...");
tree[2].addChild("...");
tree[2].addChild("...");

Ein QRangeModel, das mit einer Instanz eines solchen Bereichs instanziiert wird, stellt die Daten als Baum dar.

// instantiate the model with a pointer to the tree, not a copy!
QRangeModel model(&tree);
QTreeView view;
view.setModel(&model);

Baumdurchlaufprotokoll in einer separaten Klasse

Das Baumdurchlaufprotokoll kann auch in einer separaten Klasse implementiert werden.

struct TreeTraversal
{
    TreeRow newRow() const { return TreeRow{}; }
    const TreeRow *parentRow(const TreeRow &row) const { return row.m_parent; }
    void setParentRow(TreeRow &row, TreeRow *parent) const { row.m_parent = parent; }
    const std::optional<Tree> &childRows(const TreeRow &row) const { return row.m_children; }
    std::optional<Tree> &childRows(TreeRow &row) const { return row.m_children; }
};

Übergeben Sie eine Instanz dieser Protokollimplementierung an den QRangeModel-Konstruktor:

QRangeModel model(&tree, TreeTraversal{});

Baumzeilen als Zeiger oder Werte

Der Zeilentyp des Datenbereichs kann entweder ein Wert oder ein Zeiger sein. Im obigen Code haben wir die Baumzeilen als Werte in einem Vektor verwendet, wodurch wir uns nicht um die explizite Speicherverwaltung kümmern müssen. Ein Vektor als zusammenhängender Speicherblock macht jedoch alle Iteratoren und Referenzen ungültig, wenn Speicher neu zugewiesen werden muss oder wenn Elemente eingefügt oder entfernt werden. Dies wirkt sich auf den Zeiger auf das übergeordnete Element aus, der die Position der übergeordneten Zeile innerhalb des Vektors angibt. Sicherzustellen, dass dieses übergeordnete Element (und die „ QPersistentModelIndex “-Instanzen, die auf Elemente darin verweisen) gültig bleibt, kann einen erheblichen Leistungsaufwand verursachen. Die QRangeModel-Implementierung muss davon ausgehen, dass alle Verweise auf den Bereich bei einer Änderung des Bereichs ungültig werden.

Alternativ können wir auch einen Bereich von Zeilenzeigern als Baumtyp verwenden:

struct TreeRow;
using Tree = std::vector<TreeRow *>;

In diesem Fall müssen wir alle `TreeRow`-Instanzen explizit mit dem Operator ` new` zuweisen und den Destruktor so implementieren, dass alle Elemente im Vektor der untergeordneten Knoten mit ` delete ` freigegeben werden.

struct TreeRow
{
    Q_GADGET
public:
    TreeRow(const QString&value = {})
        : m_value(value)
    {}
    ~TreeRow()
    {
        if (m_children)
            qDeleteAll(*m_children);
    }

    // Nur Verschieben
    TreeRow(TreeRow&&) = default;
    TreeRow&operator=(TreeRow&&) = default;

   // Hilfsfunktion zum Befüllen
    template <typename...Args>
    TreeRow *addChild(Args&&...args)
    {
        if (!m_children)
            m_children.emplace(Tree{});
       auto *child = m_children->emplace_back(new TreeRow(std::forward<Args>(args)...));
        child->m_parent = this;
        return child;
    }

private:
    friend struct TreeTraversal;
    QString m_value;
    std::optional<Tree> m_children;
    TreeRow *m_parent = nullptr;
};
Tree tree = {
    new TreeRow("1"),
    new TreeRow("2"),
    new TreeRow("3"),
    new TreeRow("4"),
};
tree[0]->addChild("1.1");
tree[1]->addChild("2.1");
tree[2]->addChild("3.1")->addChild("3.1.1");
tree[3]->addChild("4.1");

Bevor wir ein Modell erstellen können, das diese Daten als Baum darstellt, müssen wir auch das Protokoll zur Baumdurchquerung implementieren.

struct TreeTraversal
{
    TreeRow *newRow() const { return new TreeRow; }
    void deleteRow(TreeRow *row) { delete row; }

    const TreeRow *parentRow(const TreeRow &row) const { return row.m_parent; }
    void setParentRow(TreeRow &row, TreeRow *parent) { row.m_parent = parent; }
    const std::optional<Tree> &childRows(const TreeRow &row) const { return row.m_children; }
    std::optional<Tree> &childRows(TreeRow &row) { return row.m_children; }
};

Eine explizite Protokollimplementierung für veränderbare Bäume aus Zeigern muss zwei zusätzliche Member-Funktionen bereitstellen: ` newRow() ` und ` deleteRow(RowType *)`.

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    Tree tree = make_tree_of_pointers();

    QRangeModel model(std::move(tree), TreeTraversal{});
    QTreeView treeView;
    treeView.setModel(&model);
    treeView.show();

    return app.exec();
}

Das Modell ruft diese Funktionen auf, wenn neue Zeilen in ` insertRows()` angelegt und Zeilen in ` removeRows()` entfernt werden. Wenn das Modell zudem die Eigentumsrechte an den Daten besitzt, löscht es bei seiner Zerstörung außerdem alle Zeilen der obersten Ebene. Beachten Sie, dass wir in diesem Beispiel den Baum in das Modell verschieben, sodass wir keine Operationen mehr daran durchführen müssen. Wenn ein `QRangeModel` durch das Verschieben von Baumdaten mit Zeilenzeigern darin erstellt wird, übernimmt es die Eigentumsrechte an den Daten und löscht die Zeilenzeiger in seinem Destruktor.

Die Verwendung von Zeigern als Zeilen ist mit einem gewissen Aufwand bei der Speicherzuweisung und -verwaltung verbunden. Die Verweise auf die Zeilenelemente bleiben jedoch stabil, selbst wenn sie innerhalb des Bereichs verschoben werden oder wenn der Bereich neu zugewiesen wird. Dies kann den Aufwand für Änderungen an der Struktur des Modells bei Verwendung von ` insertRows()`, ` removeRows()` oder ` moveRows()` erheblich reduzieren.

Jede Option bringt unterschiedliche Kompromisse hinsichtlich Leistung und Speicherbedarf mit sich. Die beste Option hängt vom jeweiligen Anwendungsfall und der verwendeten Datenstruktur ab.

Anpassung durch Vorlagenspezialisierung

QRangeModel deklariert zwei verschachtelte Vorlagentypen, die Sie spezialisieren können, um das Standardverhalten zu überschreiben.

Die oben bereits vorgestellte Vorlage „ RowOptions “ dient zur Anpassung von Funktionen, die spezifisch für den Zeilentyp sind, wie z. B. Kopfdaten, oder die einheitlich für alle Elemente in einer Zeile gelten sollen, wie z. B. Standardkennzeichen. Die Vorlage „ ItemAccess “ ermöglicht die Anpassung von elementtypspezifischem Verhalten, wie z. B. das Lesen oder Schreiben von Rollendaten.

Diese beiden Vorlagen müssen immer für den zugrunde liegenden Typ spezialisiert werden. Selbst wenn der Bereich also Zeilen vom Typ „ Row “ als „ std::unique_ptr<Row> “ oder Elemente vom Typ „ Item “ als „ std::shared_ptr<Item> “ enthält, muss die Spezialisierung für „ Row “ und „ Item “ erfolgen.

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    ...
};
std::vector<std::shared_ptr<ColorEntry>> colors;
// ...
QRangeModel model(colors);

Hinweis: In C++ sollten Sie Vorlagen ausschließlich für Typen spezialisieren, die Sie selbst definieren, und nicht für Standard- oder Qt-Typen. Erstellen Sie Unterklassen oder Aggregate für Typen, die Sie nicht selbst definieren, wenn Sie das Verhalten für diese Typen anpassen müssen. Beachten Sie, dass ein Typalias kein eigenständiger Typ ist und Sie Vorlagen nicht für Alias-Typen spezialisieren sollten. Es ist jedoch zulässig, eine Spezialisierung eines Standard- oder Qt-Containers mit einem Typ zu erstellen, über den Sie die Kontrolle haben, wie beispielsweise „ std::vector<MyGadget> “.

Zeilen- und elementspezifische Flags

Die Standardimplementierung von ` flags()` gibt eine Kombination aus ` Qt::ItemIsSelectable`, ` Qt::ItemIsEnabled` und – mit Ausnahme von Elementen in Spalte 0 eines Baummodells – ` Qt::ItemNeverHasChildren` zurück. Die Flags ` Qt::ItemIsEditable ` und ` Qt::ItemIsDropEnabled ` sind für alle Elemente in Modellen gesetzt, die nicht schreibgeschützt sind, und ` Qt::ItemIsDragEnabled ` ist gesetzt, solange das Modell mindestens ein ` mime type` unterstützt.

Um das Standardverhalten für alle Elemente in einer Zeile anzupassen, verwenden Sie die Vorlage „ RowOptions “. Um auf die Flag-Daten der einzelnen Elemente zuzugreifen, verwenden Sie die Vorlage „ ItemAccess “. Sie können beides tun: Mit „ RowOptions “ können Sie Flags setzen, die für alle Elemente in einer Zeile gelten, und mit „ ItemAccess “ können Sie Flags für Elemente setzen, die auf einem bestimmten Typ basieren.

Drag-and-Drop-Verarbeitung

Seit Qt 6.12 implementiert `QRangeModel` die virtuelle Funktion ` flags()` zum Setzen des Flags ` Qt::ItemIsDragEnabled ` für alle gültigen Elemente in einem Modell, sofern das Modell mindestens ein ` mime type` unterstützt. Dies ist die Standardeinstellung, da ` QAbstractItemModel ` den Qt-internen MIME-Typ „application/x-qabstractitemmodeldatalist“ bereitstellt. Zudem wird das Flag „ Qt::ItemIsDropEnabled “ für Elemente in einem solchen Modell gesetzt, sofern dieses Modell nicht schreibgeschützt ist. Dies schließt auch das nicht vorhandene Element am ungültigen Index ein, sodass Benutzer Daten in leere Bereiche einer Ansicht ziehen können, um die Daten anzuhängen.

Die Unterstützung für weitere MIME-Typen lässt sich implementieren, ohne QRangeModel zu unterklassen und die entsprechenden virtuellen Funktionen zu überschreiben. QRangeModel erkennt und nutzt Funktionen in den Anpassungsvorlagen „ ItemAccess “ und „ RowOptions “, um Zeilen oder Elemente als „ mime data “ zu kodieren und sie in „ decode mime data “ in Sequenzen von Zeilen oder Elementen umzuwandeln. Diese Anpassungsfunktionen können direkt auf die Zeilen- und Elementtypen angewendet werden, ohne Umwege über „ QModelIndex “ und „ QVariant “ zu nehmen.

Auf diese Weise kann der Code zur Serialisierung von Daten typsicher sein und bei der Implementierung des Typs verbleiben, der zur Speicherung der Daten verwendet wird.

Darüber hinaus sind supportedDragActions und supportedDropActions Eigenschaften, die für jede QRangeModel-Instanz konfiguriert werden können.

Fortgeschrittene C++-Themen

Das C++-Tupel-Protokoll

Wie im obigen Beispiel „ numberNames “ zu sehen ist, kann der Zeilentyp ein Tupel sein – und tatsächlich jeder Typ, der das Tupel-Protokoll implementiert. Dieses Protokoll wird durch die Spezialisierung von ` std::tuple_size ` und ` std::tuple_element` sowie durch die Überladung der nicht qualifizierten Funktion ` get ` implementiert. Führen Sie dies für Ihren benutzerdefinierten Zeilentyp durch, um vorhandene strukturierte Daten dem Modell-View-Framework in Qt zur Verfügung zu stellen.

struct Book
{
    QString title;
    QString author;
    QString summary;
    int rating = 0;

    template <size_t I, typename T>
        requires ((I <= 3) && std::is_same_v<std::remove_cvref_t<T>, Book>)
    friend inline decltype(auto) get(T &&book)
    {
        if constexpr (I == 0)
            return std::as_const(book.title);
        else if constexpr (I == 1)
            return std::as_const(book.author);
        else if constexpr (I == 2)
            return std::forward_like<T>(book.summary);
        else if constexpr (I == 3)
            return std::forward_like<T>(book.rating);
    }
};

namespace std {
    template <> struct tuple_size<Book> : std::integral_constant<size_t, 4> {};
    template <size_t I> struct tuple_element<I, Book>
    { using type = decltype(get<I>(std::declval<Book>())); };
}

In der obigen Implementierung werden die Werte „ title “ und „ author “ des Typs „ Book “ als „ const “ zurückgegeben, sodass das Modell die Elemente in diesen beiden Spalten als schreibgeschützt markiert. Der Benutzer kann keine Bearbeitung auslösen, und „ setData()“ führt keine Aktion aus und gibt „false“ zurück. Für „ summary “ und „ rating “ gibt die Implementierung dieselbe Wertkategorie wie das Buch zurück. Wenn also „ get “ mit einer veränderbaren Referenz auf „ Book “ aufgerufen wird, gibt die Funktion eine veränderbare Referenz auf die jeweilige Variable zurück. Das Modell macht diese Spalten sowohl für den Benutzer als auch für den programmatischen Zugriff bearbeitbar.

Hinweis: Die oben genannte Implementierung von ` get ` erfordert C++23.

Überlegungen zur Binärkompatibilität

QRangeModel ist keine Template-Klasse. Die Übergabe von QRangeModel-Instanzen (per Zeiger oder Referenz, wie bei allen QObject -Klassen) über Bibliotheks-APIs oder die Speicherung von QRangeModel per Wert in einer öffentlichen Klasse einer Bibliothek ist unbedenklich.

Der QRangeModel-Konstruktor ist jedoch ein Template und inline, und die interne Implementierung, die auf den Typ des Bereichs spezialisiert ist, auf dem das Modell operiert, wird im Konstruktor instanziiert. Sie sollten den Konstruktor nicht in einer inline-Implementierung einer Bibliotheks-API aufrufen. Dies führt zu ODR-Verstößen und kann die Binärkompatibilität dieser Bibliothek beeinträchtigen, wenn die Qt-Version, gegen die sie kompiliert wurde, sich von der Qt-Version unterscheidet, gegen die eine Anwendung, die diese Bibliothek nutzt, kompiliert wurde.

Neue und optimierte Implementierungen virtueller Funktionen, die in späteren Versionen von Qt eingeführt wurden, werden möglicherweise ebenfalls nicht verwendet, wenn QRangeModel feststellt, dass die Implementierung mit einer älteren Qt-Version kompiliert wurde. Beispielsweise sind die Implementierungen von ` sort()` und ` match()` neu in Qt 6.12, werden jedoch von einer Anwendung, die mit Qt 6.11 kompiliert wurde, nicht aufgerufen, selbst wenn die verwendete Qt-Bibliothek Qt 6.12 ist. Um von solchen neuen Überschreibungen zu profitieren, kompilieren Sie Ihre Anwendung neu.

Siehe auch QRangeModelAdapter, QAbstractItemModel, QStandardItemModel und Modell-View-Programmierung.

Dokumentation zu Mitgliedstypen

[since 6.11] enum class QRangeModel::AutoConnectPolicy

Diese Enumeration legt fest, ob und wann „ QRangeModel “ geänderte Signale für Eigenschaften automatisch mit dem Signal „ dataChanged()“ des Modells verbindet. Es werden nur Eigenschaften verbunden, die mit einem der Werte „ role names “ übereinstimmen.

KonstanteWertBeschreibung
QRangeModel::AutoConnectPolicy::None0Es werden keine automatischen Verbindungen hergestellt.
QRangeModel::AutoConnectPolicy::Full1Die Signale für alle relevanten Eigenschaften werden automatisch verbunden, und zwar für alle Elemente unter „ QObject “. Dies umfasst auch Elemente unter „ QObject “, die zu neu eingefügten Zeilen und Spalten hinzugefügt werden.
QRangeModel::AutoConnectPolicy::OnRead2Signale für relevante Eigenschaften werden beim ersten Lesen der Eigenschaft durch das Modell verbunden.

Der Speicheraufwand für automatische Verknüpfungen kann erheblich sein. Eine vollständige automatische Verknüpfung erfordert zwar keine zusätzliche Verwaltung neben der Verknüpfung selbst, aber jede Verknüpfung beansprucht Speicherplatz, und das Verknüpfen aller Eigenschaften aller Objekte kann sehr aufwendig sein, insbesondere wenn sich nur wenige Eigenschaften einer Teilmenge von Objekten jemals ändern.

Die Verbindungsrichtlinie „OnRead“ stellt keine Verbindungen zu Objekten oder Eigenschaften her, die nie gelesen werden (z. B. weil sie nie in einer Ansicht dargestellt werden), doch das Speichern der hergestellten Verbindungen erfordert einen gewissen Verwaltungsaufwand und führt im Laufe der Zeit zu unvorhersehbarem Speicherwachstum. So kann beispielsweise das Herunterscrollen einer langen Liste von Elementen leicht dazu führen, dass Tausende neuer Verbindungen hergestellt werden.

Diese Enumeration wurde in Qt 6.11 eingeführt.

Siehe auch autoConnectPolicy und roleNames().

[since 6.12] enum class QRangeModel::DropOperation

Diese Enumeration legt fest, wie Daten, die in einer Anpassung von ` dropMimeData()` dekodiert wurden, in das Modell geschrieben werden.

KonstanteWertBeschreibung
QRangeModel::DropOperation::DontDrop0Die Daten sollten nicht zum Modell hinzugefügt werden.
QRangeModel::DropOperation::Automatic1Qt bestimmt, wie die Daten zum Modell hinzugefügt werden.
QRangeModel::DropOperation::OverwriteAndIgnore2Das Element, auf das die Daten abgelegt wurden, sowie die nachfolgenden Elemente werden überschrieben, und alle abgelegt Daten, die nicht hineinpassen, werden verworfen.
QRangeModel::DropOperation::OverwriteAndExtend3Das Element, auf das die Daten abgelegt wurden, sowie die nachfolgenden Elemente werden überschrieben, und das Modell wird so erweitert, dass alle abgelegten Daten Platz finden.
QRangeModel::DropOperation::InsertAsSiblings4Fügen Sie alle abgelegten Daten als gleichrangige Elemente des Zielelements ein.
QRangeModel::DropOperation::InsertAsChildren5Füge alle abgelegten Daten als Kinder des Zielelements ein.

Eine Anpassung von ` dropMimeData()` kann stattdessen einen booleschen Wert zurückgeben; in diesem Fall entspricht ` false ` dem Wert `DontDrop` und ` true ` dem Wert `Automatic`.

Diese Enumeration wurde in Qt 6.12 eingeführt.

Siehe auch „ canDropMimeData()“ und „ dropMimeData()“.

enum class QRangeModel::RowCategory

Diese Enumeration beschreibt, wie „ QRangeModel “ die Elemente des Bereichs darstellen soll, mit dem es erstellt wurde.

KonstanteWertBeschreibung
QRangeModel::RowCategory::Default0QRangeModel Legt fest, wie die Zeilen dargestellt werden.
QRangeModel::RowCategory::MultiRoleItem1QRangeModel Zeigt Elemente mit einem Metaobjekt als Elemente mit mehreren Rollen an, auch wenn sie in einem eindimensionalen Bereich verwendet werden.

Spezialisieren Sie die Vorlage „ RowOptions “ für Ihren Typ und fügen Sie eine öffentliche Member-Variable „ static constexpr auto rowCategory “ mit einem der Werte aus dieser Enumeration hinzu.

Siehe auch „ RowOptions “.

Dokumentation zu Eigenschaften

[since 6.11] autoConnectPolicy : AutoConnectPolicy

sofern und sobald das Modell automatisch eine Verbindung zu Benachrichtigungen über Änderungen an Eigenschaften herstellt.

Wenn „ QRangeModel “ mit einer Datenstruktur arbeitet, die denselben Typ einer Unterklasse von „ QObject “ enthält wie ihr Zeilen- oder Elementtyp, kann es die Eigenschaften der QObjects automatisch mit dem Signal „ dataChanged()“ verknüpfen. Bei „ QObject “-Zeilen erfolgt dies für jede Spalte, wobei eine Zuordnung zur Eigenschaft „ Qt::DisplayRole “ vorgenommen wird. Bei Elementen erfolgt dies für jene Eigenschaften, die mit einem der „ role names “ übereinstimmen.

Standardmäßig lautet der Wert dieser Eigenschaft „ None “, sodass keine derartigen Verbindungen hergestellt werden. Durch Ändern des Werts dieser Eigenschaft werden stets alle bestehenden Verbindungen unterbrochen.

Hinweis: Verbindungen werden weder unterbrochen noch hergestellt, wenn QObjects in der Datenstruktur, auf die „ QRangeModel “ wirkt, ausgetauscht werden.

Diese Aufzählung wurde in Qt 6.11 eingeführt.

Zugriffsfunktionen:

QRangeModel::AutoConnectPolicy autoConnectPolicy() const
void setAutoConnectPolicy(QRangeModel::AutoConnectPolicy policy)

Notifier-Signal:

void autoConnectPolicyChanged(QRangeModel::AutoConnectPolicy policy)

Siehe auch ` roleNames()`.

roleNames : QHash<int, QByteArray>

Diese Eigenschaft enthält die Rollennamen für das Modell.

Wenn alle Spalten im Bereich denselben Typ haben und dieser Typ ein Metaobjekt bereitstellt (d. h., es handelt sich um ein Gadget oder eine Unterklasse von ` QObject `), dann enthält diese Eigenschaft die Namen der Eigenschaften dieses Typs, die den Werten von ` Qt::ItemDataRole ` zugeordnet sind – Werte aus ` Qt::UserRole ` und höher. Darüber hinaus bietet eine Rolle „modelData“ Zugriff auf die Gadget- oder „ QObject “-Instanz.

Überschreiben Sie dieses Standardverhalten, indem Sie diese Eigenschaft explizit auf eine nicht leere Zuordnung setzen. Wenn Sie diese Eigenschaft auf eine leere Zuordnung setzen oder resetRoleNames() verwenden, wird das Standardverhalten wiederhergestellt.

Zugriffsfunktionen:

virtual QHash<int, QByteArray> roleNames() const override
void setRoleNames(const QHash<int, QByteArray> &names)
void resetRoleNames()

Notifier-Signal:

void roleNamesChanged()

Siehe auch ` QAbstractItemModel::roleNames()`.

[since 6.12] sortCollator : QCollator

Diese Eigenschaft enthält den Sortieralgorithmus, der beim Sortieren des Modells verwendet wird

Der Standardwert dieser Eigenschaft ist ein „ QCollator “ für die C-Locale. Die Sortierung erfolgt ohne Berücksichtigung der Locale und unterscheidet Groß- und Kleinschreibung. Durch das Festlegen eines Sortieralgorithmus wird die Sortierung locale-abhängig.

Diese Aufzählung wurde in Qt 6.12 eingeführt.

Zugriffsfunktionen:

QCollator sortCollator() const
void setSortCollator(const QCollator &collator)
void resetSortCollator()

Notifier-Signal:

void sortCollatorChanged(const QCollator &collator)

Siehe auch „ sort()“, „ sortRole “ und „ QSortFilterProxyModel “.

[since 6.12] sortRole : int

Diese Eigenschaft enthält die Datenrolle, die beim Sortieren von Elementen verwendet wird.

Der Standardwert lautet „ Qt::DisplayRole “.

Diese Aufzählung wurde in Qt 6.12 eingeführt.

Zugriffsfunktionen:

int sortRole() const
void setSortRole(int role)
void resetSortRole()

Notifier-Signal:

void sortRoleChanged(int role)

Siehe auch „ sort()“, „ sortCollator “ und „ QSortFilterProxyModel “.

[since 6.12] supportedDragActions : Qt::DropActions

Diese Eigenschaft enthält die von diesem Modell unterstützten Drag-Aktionen.

Aktionen, die das Modell nicht unterstützen kann – wie beispielsweise das Verschieben von Daten aus einem schreibgeschützten Modell –, werden beim Festlegen der Aktionen entfernt.

Hinweis: Das Überschreiben dieser Funktion in einer Unterklasse von ` QRangeModel ` ist möglich, kann jedoch das Verhalten der Eigenschaft beeinträchtigen.

Diese Aufzählung wurde in Qt 6.12 eingeführt.

Zugriffsfunktionen:

virtual Qt::DropActions supportedDragActions() const override
void setSupportedDragActions(Qt::DropActions actions)
void resetSupportedDragActions()

Notifier-Signal:

void supportedDragActionsChanged(Qt::DropActions actions)

Siehe auch ` supportedDropActions`.

[since 6.12] supportedDropActions : Qt::DropActions

Diese Eigenschaft enthält die von diesem Modell unterstützten Drop-Aktionen.

Schreibgeschützte Modelle können keine Drag-and-Drop-Aktionen unterstützen.

Hinweis: Das Überschreiben dieser Funktion in einer Unterklasse von ` QRangeModel ` ist möglich, kann jedoch das Verhalten der Eigenschaft beeinträchtigen.

Diese Aufzählung wurde in Qt 6.12 eingeführt.

Zugriffsfunktionen:

virtual Qt::DropActions supportedDropActions() const override
void setSupportedDropActions(Qt::DropActions actions)
void resetSupportedDropActions()

Notifier-Signal:

void supportedDropActionsChanged(Qt::DropActions actions)

Siehe auch „ supportedDragActions “.

Dokumentation zu den Member-Funktionen

[explicit] template <typename Range, int = true> QRangeModel::QRangeModel(Range &&range, QObject *parent = nullptr)

[explicit] template <typename Range, int = true> QRangeModel::QRangeModel(Range &&range, QObject *parent = nullptr)

[explicit] template < typename Range, typename Protocol, int = true > QRangeModel::QRangeModel(Range &&range, Protocol &&protocol, QObject *parent = nullptr)

Erstellt eine Instanz von „ QRangeModel “, die auf die Daten in „ range “ angewendet wird. „ range “ muss ein sequenzieller Bereich sein, für den der Compiler durch argumentabhängige Suche die Überladungen „ begin “ und „ end “ findet oder für den „ std::begin “ und „ std::end “ implementiert sind. Wird „ protocol “ angegeben, stellt das Modell den Bereich mithilfe der Protokollimplementierung als Baum dar. Die Modellinstanz wird zu einem untergeordneten Element von „ parent “.

range kann ein Zeiger oder ein Referenz-Wrapper sein; in diesem Fall ändern Modell-APIs zur Datenänderung (wie setData() oder insertRow()) die Daten in der referenzierten Bereichsinstanz. Ist range ein Wert (oder wurde ins Modell verschoben), so muss eine Verbindung zu den vom Modell ausgesendeten Signalen hergestellt werden, um auf Änderungen an den Daten zu reagieren.

QRangeModel wird während der Erstellung nicht auf das ` range ` zugreifen. Dadurch ist es zulässig, einen Zeiger oder eine Referenz auf ein noch nicht vollständig erstelltes Bereichsobjekt an diesen Konstruktor zu übergeben, beispielsweise bei ` subclassing QRangeModel`.

Wurde das ` range ` in das Modell verschoben, werden der Bereich und alle darin enthaltenen Daten bei der Zerstörung des Modells vernichtet.

Hinweis: Auch wenn das Modell ansonsten keine Eigentumsrechte am Bereichsobjekt übernimmt, dürfen Sie das ` range ` nicht direkt ändern, sobald das Modell erstellt und an eine Ansicht übergeben wurde. Solche Änderungen lösen keine Signale aus, die erforderlich sind, um Modellnutzer (andere Modelle oder Ansichten) mit dem Modell synchron zu halten, was zu inkonsistenten Ergebnissen, undefiniertem Verhalten und Abstürzen führt. Verwenden Sie ` QRangeModelAdapter `, um sicher mit dem zugrunde liegenden Bereich zu interagieren und das Modell gleichzeitig auf dem neuesten Stand zu halten.

Siehe auch „ QRangeModelAdapter “.

[override virtual noexcept] QRangeModel::~QRangeModel()

Zerstört die „ QRangeModel “.

Auf den Bereich, aus dem das Modell erstellt wurde, wird nicht zugegriffen, und er wird nur gelöscht, wenn das Modell aus einem verschobenen Bereich erstellt wurde.

[override virtual] QModelIndex QRangeModel::buddy(const QModelIndex &index) const

Implementiert neu: ` QAbstractItemModel::buddy(const QModelIndex &index) const`.

[override virtual] bool QRangeModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const

Implementiert: ` QAbstractItemModel::canDropMimeData` (const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const.

Wenn für den im Bereich gespeicherten Elementtyp eine Anpassung von ` ItemAccess ` verfügbar ist und diese Anpassung eine geeignete Klassenmitgliedsfunktion ` canDropMimeData()` implementiert, ruft diese Implementierung diese Funktion auf und gibt das Ergebnis zurück.

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static bool canDropMimeData(const QMimeData *mimeData)
    {
        // ...
        return true;
    }
};

Andernfalls, wenn für den Zeilentyp im Bereich eine Anpassung von ` RowOptions ` mit einer geeigneten Klassenmitgliedsfunktion ` canDropMimeData()` verfügbar ist, gibt diese Implementierung das Ergebnis des Aufrufs dieser Funktion zurück.

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    static bool canDropMimeData(const QMimeData *mimeData)
    {
        // ...
        return true;
    }
};

Ist keine der beiden Anpassungen verfügbar, gibt diese Implementierung das Ergebnis der Standardimplementierung von ` QAbstractItemModel ` zurück.

Siehe auch „ Drag'n'drop handling“, „ RowOptions::canDropMimeData()“, „ ItemAccess::canDropMimeData()“, „ dropMimeData()“, „ mimeTypes()“ und „ mimeData()“.

[override virtual] bool QRangeModel::canFetchMore(const QModelIndex &parent) const

Implementiert neu: ` QAbstractItemModel::canFetchMore(const QModelIndex &parent) const`.

[override virtual] bool QRangeModel::clearItemData(const QModelIndex &index)

Implementiert: ` QAbstractItemModel::clearItemData(const QModelIndex &index)`.

Ersetzt den im Bereich unter index gespeicherten Wert durch einen standardmäßig konstruierten Wert.

Bei Modellen, die auf einem schreibgeschützten Bereich oder auf einer schreibgeschützten Spalte eines Zeilentyps operieren, der ` the C++ tuple protocol` implementiert, gibt diese Implementierung sofort ` false ` zurück.

[override virtual] int QRangeModel::columnCount(const QModelIndex &parent = {}) const

Umsetzt: ` QAbstractItemModel::columnCount(const QModelIndex &parent) const`.

Gibt die Anzahl der Spalten des Modells zurück. Diese Funktion gibt für alle „ parent “-Indizes denselben Wert zurück.

Bei Modellen, die mit einem Zeilentyp mit statischer Größe arbeiten, bleibt dieser Rückgabewert während der gesamten Lebensdauer des Modells unverändert. Bei Modellen, die mit einem Zeilentyp mit dynamischer Größe arbeiten, gibt das Modell die Anzahl der Elemente in der ersten Zeile zurück oder 0, falls das Modell keine Zeilen enthält.

Siehe auch „ rowCount “ und „ insertColumns()“.

[override virtual] QVariant QRangeModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

Implementiert: ` QAbstractItemModel::data(const QModelIndex &index, int role) const`.

Gibt die unter dem angegebenen ` role ` gespeicherten Daten für den Wert in dem Bereich zurück, auf den der ` index` verweist.

Ist der Elementtyp für diesen Index ein assoziativer Container, der entweder von int, Qt::ItemDataRole oder QString auf einen QVariant abbildet, werden die Rollendaten in diesem Container nachgeschlagen und zurückgegeben.

Ist das Element ein Gadget oder ein ` QObject`, gibt die Implementierung den Wert der Eigenschaft des Elements zurück, die dem Eintrag ` role ` in der Zuordnung ` roleNames()` entspricht.

Andernfalls gibt die Implementierung ein „ QVariant “ zurück, das aus dem Element über „ QVariant::fromValue() “ für „ Qt::DisplayRole “ oder „ Qt::EditRole “ konstruiert wurde. Für andere Rollen gibt die Implementierung ein ungültiges (standardmäßig konstruiertes) „ QVariant “ zurück.

Siehe auch Qt::ItemDataRole, setData() und headerData().

[override virtual] bool QRangeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)

Implementiert: QAbstractItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent).

Wenn für den im Bereich gespeicherten Elementtyp eine Anpassung von ` ItemAccess ` verfügbar ist und diese Anpassung eine geeignete Klassenmitgliedsfunktion ` dropMimeData()` implementiert, ruft diese Implementierung diese Funktion auf und gibt das Ergebnis zurück.

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static bool dropMimeData(const QMimeData *mimeData, auto inserter)
    {
        QByteArray data = mimeData->data(mimeTypes().first());
        if (data.isEmpty())
            return false;
        QTextStream stream(&data, QIODevice::ReadOnly);
        while (!stream.atEnd()) {
            QString colorName;
            stream >> colorName;
            inserter = ColorEntry(colorName);
        }
        return true;
    }
};

Andernfalls, wenn für den Zeilentyp im Bereich eine Anpassung von ` RowOptions ` mit einer geeigneten Klassenmitgliedsfunktion ` dropMimeData()` verfügbar ist, gibt diese Implementierung das Ergebnis des Aufrufs dieser Funktion zurück.

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    static bool dropMimeData(const QMimeData *mimeData, auto inserter)
    {
        const QByteArray data = mimeData->data(mimeTypes().first());
        if (data.isEmpty())
            return false;
        QXmlStreamReader stream(data);
        while (!stream.atEnd()) {
            stream.readNext();
            if (stream.isStartElement() && stream.name() == u"li"_s)
                inserter = ColorEntry(stream.readElementText());
        }

        return true;
    }
};

Ist keine der beiden Anpassungen verfügbar, gibt diese Implementierung das Ergebnis der Standardimplementierung von ` QAbstractItemModel ` zurück.

Siehe auch „ Drag'n'drop handling“, „ RowOptions::dropMimeData()“, „ ItemAccess::dropMimeData()“, „ canDropMimeData()“, „ mimeTypes()“ und „ mimeData()“.

[override virtual protected] bool QRangeModel::event(QEvent *event)

Implementiert: ` QObject::event(QEvent *e)`.

[override virtual protected] bool QRangeModel::eventFilter(QObject *object, QEvent *event)

Implementiert neu: ` QObject::eventFilter` (`QObject *watched, QEvent *event`).

[override virtual] void QRangeModel::fetchMore(const QModelIndex &parent)

Implementiert: ` QAbstractItemModel::fetchMore(const QModelIndex &parent)`.

[override virtual] Qt::ItemFlags QRangeModel::flags(const QModelIndex &index) const

Implementiert: ` QAbstractItemModel::flags(const QModelIndex &index) const`.

Gibt die Elementflags für das angegebene ` index` zurück.

Die Implementierung gibt eine Kombination von Flags zurück, die das Element (`ItemIsEnabled`) aktivieren und dessen Auswahl ermöglichen (`ItemIsSelectable`). Bei Modellen, die mit einem Bereich mit veränderbaren Daten arbeiten, wird zusätzlich das Flag gesetzt, das die Bearbeitung des Elements ermöglicht (`ItemIsEditable`).

Modelle, die eine nicht leere Liste von ` mimeTypes()` zurückgeben, setzen ebenfalls das ` Qt::ItemIsDragEnabled` und – sofern sie nicht schreibgeschützt sind – das ` Qt::ItemIsDropEnabled `-Flag.

Flache Modelle setzen das Flag „ Qt::ItemNeverHasChildren “ für alle Elemente, während hierarchische Modelle dieses Flag für alle Elemente in Spalten oberhalb von 0 setzen.

Um die Flags für Ihre eigenen Datentypen anzupassen, stellen Sie eine Spezialisierung von „ RowOptions “ und/oder „ ItemAccess “ für Ihre Zeilen- oder Elementtypen bereit und implementieren Sie eine statische Mitgliedsfunktion „ flags()“:

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static Qt::ItemFlags flags(const ColorEntry &entry)
    {
        return entry.flags();
    }
};

Siehe auch „ Qt::ItemFlags “, „ RowOptions “ und „ ItemAccess “.

[override virtual] bool QRangeModel::hasChildren(const QModelIndex &parent = QModelIndex()) const

Implementiert erneut: ` QAbstractItemModel::hasChildren(const QModelIndex &parent) const`.

[override virtual] QVariant QRangeModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

Implementiert: ` QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role) const`.

Gibt die Daten für die angegebenen „ role “ und „ section “ in der Kopfzeile mit der angegebenen „ orientation “ zurück.

Bei horizontalen Kopfzeilen entspricht die Abschnittsnummer der Spaltennummer. Bei vertikalen Kopfzeilen entspricht die Abschnittsnummer entsprechend der Zeilennummer.

Für die horizontale Kopfzeile und die Qt::DisplayRole role geben Modelle, die auf einem Bereich arbeiten, der ein Array als Zeilentyp verwendet, section zurück. Ist der Zeilentyp ein Tupel, gibt die Implementierung den Namen des Typs an der Position section zurück. Bei Zeilen vom Typ „Gadget“ oder „ QObject “ gibt diese Funktion den Namen der Eigenschaft an der Position section zurück.

Um die Daten der horizontalen Kopfzeile für Ihren eigenen Bereich anzupassen, stellen Sie eine Spezialisierung von RowOptions für Ihre Zeilentypen bereit und implementieren Sie eine Klassenmitgliedsfunktion headerData():

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    static QVariant headerData(int section, int role)
    {
        switch (section) {
            // ...
        }
        return {};
    }
};

Für die vertikale Kopfzeile gibt diese Funktion immer das Ergebnis der Standardimplementierung in ` QAbstractItemModel` zurück.

Siehe auch „ Qt::ItemDataRole“ , „ setHeaderData()“, „ QHeaderView “ und „ RowOptions “.

[override virtual] QModelIndex QRangeModel::index(int row, int column, const QModelIndex &parent = {}) const

Umsetzung von: ` QAbstractItemModel::index(int row, int column, const QModelIndex &parent) const`.

Gibt den Index des Modellelements an den Koordinaten row und column in parent zurück.

Die Übergabe eines gültigen übergeordneten Elements führt bei Modellen, die mit Listen- und Tabellenbereichen arbeiten, zu einem ungültigen Index.

Siehe auch parent().

[override virtual] bool QRangeModel::insertColumns(int column, int count, const QModelIndex &parent = {})

Implementiert neu: QAbstractItemModel::insertColumns(int column, int count, const QModelIndex &parent).

Fügt count leere Spalten vor dem Element unter column in allen Zeilen des Bereichs unter parent ein. Gibt bei Erfolg true zurück; andernfalls wird false zurückgegeben.

Hinweis: Ein Zeilentyp mit dynamischer Größe muss eine Memberfunktion ` insert(const_iterator, size_t, value_type) ` bereitstellen.

Bei Modellen, die auf einem schreibgeschützten Bereich oder auf einem Bereich mit einem statisch dimensionierten Zeilentyp (wie z. B. einem Tupel, Array oder einer Struktur) arbeiten, führt diese Implementierung keine Aktion durch und gibt sofort „ false “ zurück. Dies ist bei Baummodellen immer der Fall.

[override virtual] bool QRangeModel::insertRows(int row, int count, const QModelIndex &parent = {})

Implementiert neu: QAbstractItemModel::insertRows(int row, int count, const QModelIndex &parent).

Fügt count leere Zeilen vor dem angegebenen „ row “ in den Bereich unter parent ein. Gibt bei Erfolg „ true “ zurück; andernfalls „ false “.

Hinweis: Der Bereich muss dynamisch dimensioniert sein und eine Memberfunktion „ insert(const_iterator, size_t, value_type) “ bereitstellen.

Bei Modellen, die mit einem schreibgeschützten oder statisch dimensionierten Bereich (z. B. einem Array) arbeiten, führt diese Implementierung keine Aktion durch und gibt sofort ` false ` zurück.

Hinweis: Bei Bereichen mit einem Spaltentyp dynamischer Größe muss die Spalte eine „ resize(size_t) “-Memberfunktion bereitstellen.

[override virtual] QMap<int, QVariant> QRangeModel::itemData(const QModelIndex &index) const

Umsetzt: ` QAbstractItemModel::itemData(const QModelIndex &index) const`.

Gibt eine Zuordnung mit Werten für alle vordefinierten Rollen im Modell für das Element an der angegebenen „ index “ zurück.

Wenn der Elementtyp für diesen ` index ` ein assoziativer Container ist, der entweder von ` int`, ` Qt::ItemDataRole` oder ` QString ` auf ` QVariant` abbildet, werden die Daten aus diesem Container zurückgegeben.

Ist der Elementtyp ein Gadget oder eine Unterklasse von ` QObject `, werden die Werte jener Eigenschaften zurückgegeben, die einem ` role name ` entsprechen.

Ist das Element kein assoziativer Container, kein Gadget und keine Unterklasse von ` QObject `, wird die Implementierung der Basisklasse aufgerufen.

Siehe auch ` setItemData()`, ` Qt::ItemDataRole` und ` data()`.

[override virtual] QModelIndexList QRangeModel::match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const

Implementiert neu: ` QAbstractItemModel::match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const`.

Gibt eine Liste von Indizes für die Elemente in der Spalte von ` start ` zurück, bei denen die unter ` role ` gespeicherten Daten mit ` value` übereinstimmen, wobei die durch ` flags` definierten Übereinstimmungskriterien verwendet werden. Verwenden Sie ` hits = -1`, um alle übereinstimmenden Elemente zu finden.

Hinweis: Diese Implementierung liest Daten direkt aus dem zugrunde liegenden C++-Bereich und erfolgt nicht über die Umdefinierungen von ` data()`.

[override virtual] QMimeData *QRangeModel::mimeData(const QModelIndexList &indexes) const

Implementiert: ` QAbstractItemModel::mimeData(const QModelIndexList &indexes) const`.

Wenn für den im Bereich gespeicherten Elementtyp eine Anpassung von ` ItemAccess ` verfügbar ist und diese Anpassung eine geeignete Klassenmitgliedsfunktion ` mimeData()` implementiert, ruft diese Implementierung diese Funktion auf und gibt das Ergebnis zurück.

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static QMimeData *mimeData(const auto &range)
    {
        QByteArray data;
        QTextStream stream(&data, QIODevice::WriteOnly);
        for (const auto &[item, index] : range)
            stream << item.colorName() << Qt::endl;

        QMimeData *result = new QMimeData;
        result->setData(mimeTypes().first(), data);
        // Qt handles encoding into the default mime type
        return result;
    }
};

Andernfalls, wenn eine Anpassung von ` RowOptions ` für den Zeilentyp im Bereich mit einer geeigneten Klassenmitgliedsfunktion ` mimeData()` verfügbar ist, gibt diese Implementierung das Ergebnis des Aufrufs dieser Funktion zurück.

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    template <typename Items>
    static QMimeData *mimeData(const Items &items)
    {
        if (items.isEmpty())
            return nullptr;
        QByteArray data;
        QXmlStreamWriter stream(&data);
        stream.writeStartElement("ul");
        for (const auto &[item, index] : items)
            stream.writeTextElement("li", item.colorName());
        stream.writeEndElement();

        QMimeData *mimeData = new QMimeData;
        mimeData->setData(mimeTypes().first(), data);
        return mimeData;
    }
};

Ist keine der beiden Anpassungen verfügbar, gibt diese Implementierung das Ergebnis der Standardimplementierung von ` QAbstractItemModel ` zurück.

Siehe auch „ Drag'n'drop handling“, „ RowOptions::mimeData()“, „ ItemAccess::mimeData()“, „ canDropMimeData()“, „ dropMimeData()“ und „ mimeTypes()“.

[override virtual] QStringList QRangeModel::mimeTypes() const

Implementiert neu: QAbstractItemModel::mimeTypes() const.

Wenn für den im Bereich gespeicherten Elementtyp eine Anpassung von ` ItemAccess ` verfügbar ist und diese Anpassung eine geeignete Klassenmitgliedsfunktion ` mimeTypes()` implementiert, ruft diese Implementierung diese Funktion auf und gibt das Ergebnis zurück.

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static QStringList mimeTypes()
    {
        return {
            u"text/plain"_s,
            u"application/x-qabstractitemmodeldatalist"_s
        };
    }
};

Andernfalls, wenn für den Zeilentyp im Bereich eine Anpassung von ` RowOptions ` mit einer geeigneten Klassenmitgliedsfunktion ` mimeTypes()` verfügbar ist, gibt diese Implementierung das Ergebnis des Aufrufs dieser Funktion zurück.

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    static QStringList mimeTypes()
    {
        return {
            u"text/html"_s
        };
    }
};

Ist keine der beiden Anpassungen verfügbar, gibt diese Implementierung das Ergebnis der Standardimplementierung von ` QAbstractItemModel ` zurück.

Siehe auch „ Drag'n'drop handling“, „ RowOptions::mimeTypes()“, „ ItemAccess::mimeTypes()“, „ canDropMimeData()“, „ dropMimeData()“ und „ mimeData()“.

[override virtual] bool QRangeModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationColumn)

Umsetzung von: QAbstractItemModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild).

Verschiebt die Spalten „ count “, beginnend mit der angegebenen Spalte „ sourceColumn “ unter dem übergeordneten Element „ sourceParent “, in die Spalte „ destinationColumn “ unter dem übergeordneten Element „ destinationParent “.

Gibt ` true ` zurück, wenn die Spalten erfolgreich verschoben wurden; andernfalls wird ` false` zurückgegeben.

[override virtual] bool QRangeModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationRow)

Umsetzt: QAbstractItemModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild).

Verschiebt die Zeilen count, beginnend mit der angegebenen Zeile sourceRow unter dem übergeordneten Element sourceParent, in die Zeile destinationRow unter dem übergeordneten Element destinationParent.

Gibt ` true ` zurück, wenn die Zeilen erfolgreich verschoben wurden; andernfalls wird ` false` zurückgegeben.

[override virtual] void QRangeModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const

Implementiert neu: ` QAbstractItemModel::multiData` (const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const.

[override virtual] QModelIndex QRangeModel::parent(const QModelIndex &child) const

Implementiert: ` QAbstractItemModel::parent(const QModelIndex &index) const`.

Gibt das übergeordnete Element des Eintrags am Index „ child “ zurück.

Diese Funktion liefert bei Modellen, die mit Listen- und Tabellenbereichen arbeiten, stets einen ungültigen Index. Bei Modellen, die mit einem Baum arbeiten, gibt diese Funktion den Index für das Zeilenelement zurück, das von der `parent()`-Implementierung des Baumdurchlaufprotokolls zurückgegeben wird.

Siehe auch ` index()` und ` hasChildren()`.

[override virtual] bool QRangeModel::removeColumns(int column, int count, const QModelIndex &parent = {})

Implementiert: QAbstractItemModel::removeColumns(int column, int count, const QModelIndex &parent).

Entfernt count Spalten aus dem Element unter column on in allen Zeilen des Bereichs unter parent. Gibt bei Erfolg true zurück, andernfalls false.

Hinweis: Ein Zeilentyp mit dynamischer Größe muss eine Memberfunktion „ erase(const_iterator, size_t) “ bereitstellen.

Bei Modellen, die auf einem schreibgeschützten Bereich oder auf einem Bereich mit einem Zeilentyp mit statischer Größe (wie z. B. einem Tupel, Array oder einer Struktur) arbeiten, führt diese Implementierung keine Aktion durch und gibt sofort „ false “ zurück. Dies ist bei Baummodellen immer der Fall.

[override virtual] bool QRangeModel::removeRows(int row, int count, const QModelIndex &parent = {})

Implementiert: QAbstractItemModel::removeRows(int row, int count, const QModelIndex &parent).

Entfernt count Zeilen aus dem Bereich unter parent, beginnend mit dem angegebenen row. Gibt bei Erfolg „ true “ zurück, andernfalls „ false “.

Hinweis: Der Bereich muss dynamisch dimensioniert sein und eine erase(const_iterator, size_t) -Memberfunktion bereitstellen.

Bei Modellen, die mit einem schreibgeschützten oder statisch dimensionierten Bereich (wie z. B. einem Array) arbeiten, führt diese Implementierung keine Aktion aus und gibt sofort ` false ` zurück.

[override virtual protected slot] void QRangeModel::resetInternalData()

Implementiert: QAbstractItemModel::resetInternalData().

[override virtual] QHash<int, QByteArray> QRangeModel::roleNames() const

Implementiert neu: ` QAbstractItemModel::roleNames()` const.

Hinweis: Das Überschreiben dieser Funktion in einer Unterklasse von ` QRangeModel ` ist möglich, kann jedoch das Verhalten der Eigenschaft beeinträchtigen.

Hinweis: Getter -Funktion für die Eigenschaft `roleNames`.

Siehe auch setRoleNames().

[override virtual] int QRangeModel::rowCount(const QModelIndex &parent = {}) const

Umsetzt: ` QAbstractItemModel::rowCount(const QModelIndex &parent) const`.

Gibt die Anzahl der Zeilen unter dem angegebenen ` parent` zurück. Bei einem ungültigen ` parent `-Index entspricht dies der Anzahl der Elemente im Stammbereich.

Ist der ` parent `-Index gültig, gibt diese Funktion für Modelle, die mit Listen- und Tabellenbereichen arbeiten, immer 0 zurück. Bei Bäumen gibt sie die Größe des Bereichs zurück, der von der `childRows()`-Implementierung des Baumdurchlaufprotokolls zurückgegeben wird.

Siehe auch „ columnCount()“, „ insertRows()“ und „ hasChildren()“.

[override virtual] bool QRangeModel::setData(const QModelIndex &index, const QVariant &data, int role = Qt::EditRole)

Umsetzung von: ` QAbstractItemModel::setData` (const QModelIndex &index, const QVariant &value, int role).

Setzt die „ role “-Daten für das Element unter „ index “ auf „ data “ .

Wenn der Elementtyp für diesen „ index “ ein assoziativer Container ist, der entweder von „ int “, „ Qt::ItemDataRole “ oder „ QString “ auf „ QVariant “ abbildet, wird „ data “ in diesem Container für den durch „ role “ angegebenen Schlüssel gespeichert.

Handelt es sich bei dem Element um ein Gadget oder um QObject, wird data in die Eigenschaft des Elements geschrieben, die dem Eintrag role in der Zuordnung roleNames() entspricht. Die Funktion gibt true zurück, wenn eine Eigenschaft gefunden wurde und data einen Wert gespeichert hat, der in den erforderlichen Typ konvertiert werden konnte; andernfalls gibt sie false zurück.

Andernfalls weist diese Implementierung den Wert in „ data “ dem Element an „ index “ im Bereich für „ Qt::DisplayRole “ und „ Qt::EditRole “ zu und gibt „ true “ zurück. Für andere Rollen gibt die Implementierung „ false “ zurück.

Bei Modellen, die auf einem schreibgeschützten Bereich oder auf einer schreibgeschützten Spalte in einem Zeilentyp arbeiten, der ` the C++ tuple protocol` implementiert, gibt diese Implementierung sofort ` false ` zurück.

Siehe auch data().

[override virtual] bool QRangeModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &data, int role = Qt::EditRole)

Implementiert: ` QAbstractItemModel::setHeaderData` (int section, Qt::Orientation orientation, const QVariant &value, int role).

Siehe auch headerData().

[override virtual] bool QRangeModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &data)

Implementiert: QAbstractItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles).

Wenn der Elementtyp für dieses ` index ` ein assoziativer Container ist, der entweder von ` int ` oder ` Qt::ItemDataRole ` auf ` QVariant` abbildet, werden die Einträge in ` data ` in diesem Container gespeichert. Wenn der assoziative Container von ` QString ` auf ` QVariant` abbildet, werden nur jene Werte in ` data ` gespeichert, für die eine Zuordnung in der Tabelle ` role names ` vorhanden ist.

Handelt es sich bei dem Elementtyp um ein Gadget oder eine Unterklasse von „ QObject “, werden jene Eigenschaften, die mit einem Eintrag in „ role name “ übereinstimmen, auf den entsprechenden Wert in „ data “ gesetzt.

Rollen, für die kein Eintrag in „ data “ vorhanden ist, werden nicht geändert.

Bei Elementtypen, die kopiert werden können, ist diese Implementierung transaktional und gibt „true“ zurück, wenn alle Einträge aus data gespeichert werden konnten. Konnte ein Eintrag nicht aktualisiert werden, wird der ursprüngliche Container überhaupt nicht verändert, und die Funktion gibt „false“ zurück.

Ist das Element kein assoziativer Container, kein Gadget oder keine Unterklasse von ` QObject `, wird die Implementierung der Basisklasse aufgerufen, die für jeden Eintrag in ` data` die Funktion ` setData()` aufruft.

Siehe auch ` itemData()`, ` setData()` und ` Qt::ItemDataRole`.

[override virtual] QModelIndex QRangeModel::sibling(int row, int column, const QModelIndex &index) const

Umsetzung von: ` QAbstractItemModel::sibling(int row, int column, const QModelIndex &index) const`.

Gibt das Geschwisterelement an den Positionen „ row “ und „ column “ für das Element an der Position „ index “ zurück oder einen ungültigen „ QModelIndex “, falls an dieser Position kein Geschwisterelement vorhanden ist.

Diese Implementierung ist deutlich schneller als die Verwendung von ` parent()` über ` index`.

Siehe auch index(), QModelIndex::row() und QModelIndex::column().

[override virtual] void QRangeModel::sort(int column, Qt::SortOrder order = Qt::AscendingOrder)

Implementiert: QAbstractItemModel::sort(int column, Qt::SortOrder order).

Sortiert den zugrunde liegenden Bereich gemäß der angegebenen Sortierreihenfolge ` order`, basierend auf den Daten für die Sortierreihenfolge ` sortRole ` (standardmäßig `Qt::DisplayRole `) der Elemente in ` column`.

Hinweis: Diese Implementierung verwendet, sofern verfügbar, die Memberfunktion ` sort(Compare comp) ` des C++-Bereichs (z. B. in ` std::list`), andernfalls ` std::stable_sort() `, wenn der Bereich Iteratoren mit wahlfreiem Zugriff bereitstellt. Ist keine der beiden verfügbar, führt die Implementierung keine Aktion aus und kehrt sofort zurück.

Hinweis: Der Zugriff auf das Element löst das Auslesen von Daten nicht über Überschreibungen von ` data()` aus.

Siehe auch sortRole und QSortFilterProxyModel.

[override virtual] QSize QRangeModel::span(const QModelIndex &index) const

Implementiert: ` QAbstractItemModel::span(const QModelIndex &index) const`.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.