QRangeModel Class
QRangeModel은 모든 C++ 범위에 대해 QAbstractItemModel 을 구현합니다. 더 보기...
Header: | #include <QRangeModel> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
이후: | Qt 6.10 |
상속합니다: | QAbstractItemModel |
참고: 이 클래스의 모든 함수는 재인용됩니다.
공용 형
(since 6.10) struct | RowOptions |
enum class | RowCategory { Default, MultiRoleItem } |
속성
- roleNames : QHash<int, QByteArray>
공용 함수
QRangeModel(Range &&range, QObject *parent = nullptr) | |
QRangeModel(Range &&range, Protocol &&protocol, QObject *parent = nullptr) | |
virtual | ~QRangeModel() override |
void | resetRoleNames() |
void | setRoleNames(const QHash<int, QByteArray> &names) |
재구현된 공용 함수
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 |
신호
void | roleNamesChanged() |
재구현된 보호 함수
virtual bool | event(QEvent *event) override |
virtual bool | eventFilter(QObject *object, QEvent *event) override |
보호된 슬롯
virtual void | resetInternalData() override |
상세 설명
QRangeModel은 순차적으로 이터러블한 C++ 타입의 데이터를 Qt의 모델/뷰 프레임워크에서 사용할 수 있도록 합니다. 이를 통해 Qt Widgets 및 Qt Quick 항목 보기에서 기존 데이터 구조를 쉽게 표시하고 애플리케이션 사용자가 그래픽 사용자 인터페이스를 사용하여 데이터를 조작할 수 있습니다.
QRangeModel을 사용하려면 C++ 범위로 인스턴스화하고 하나 이상의 뷰의 모델로 설정합니다:
std::array<int, 5> numbers = {1, 2, 3, 4, 5}; QRangeModel model(numbers); listView.setModel(&model);
모델 만들기
범위는 표준 메서드 std::begin
및 std::end
가 구현되고 반환된 반복자 유형이 std::forward_iterator
를 만족하는 모든 C++ 유형이 될 수 있습니다. std::size
을 사용할 수 있고 반복자가 std::random_access_iterator
을 만족하는 경우 특정 모델 연산이 더 잘 수행됩니다.
범위는 모델을 구성할 때 제공해야 하며, 나중에 범위를 설정하는 API가 없고 모델에서 범위를 검색하는 API도 없습니다. 범위는 값, 참조 래퍼 또는 포인터로 제공할 수 있습니다. 모델이 어떻게 구성되었는지에 따라 모델 API를 통한 변경이 원본 데이터를 수정할지 여부가 결정됩니다.
값으로 구성된 경우 모델은 범위의 복사본을 만들고 setData() 또는 insertRows()와 같이 모델을 수정하는 QAbstractItemModel API는 원래 범위에 영향을 미치지 않습니다.
QRangeModel model(numbers);
범위를 다시 검색하는 API가 없기 때문에 값을 기준으로 모델을 구성하는 것은 대부분 읽기 전용 데이터를 표시하는 데만 유용합니다. 데이터에 대한 변경 사항은 모델에서 방출되는 신호(예: dataChanged())를 사용하여 모니터링할 수 있습니다.
모델의 수정 사항이 원래 범위에 영향을 미치도록 하려면 포인터로 범위를 제공하세요:
QRangeModel model(&numbers);
또는 참조 래퍼를 통해 범위를 제공하세요:
QRangeModel model(std::ref(numbers));
이 경우 모델을 수정하는 QAbstractItemModel API도 범위를 수정합니다. insertRows () 또는 removeColumns()와 같이 범위의 구조를 수정하는 메서드는 표준 C++ 컨테이너 API resize()
, insert()
, erase()
를 사용하여 데이터를 설정하거나 지우는 뮤팅 이터레이터를 역참조하는 것 외에도 범위의 구조를 수정합니다.
참고: 모델이 만들어져 뷰에 전달된 후에는 모델이 작동하는 범위를 더 이상 직접 수정할 필요가 없습니다. 모델의 뷰는 변경 사항에 대한 알림을 받지 못하며, 구조적 변경으로 인해 모델이 유지 관리하는 QPersistentModelIndex 인스턴스가 손상될 수 있습니다.
호출자는 범위의 수명이 모델의 수명을 초과하는지 확인해야 합니다.
스마트 포인터를 사용하여 모든 클라이언트가 범위를 사용할 때만 범위가 삭제되도록 하세요.
auto shared_numbers = std::make_shared<std::vector<int>>(numbers); QRangeModel model(shared_numbers);
QRangeModel은 공유 포인터와 고유 포인터를 모두 지원합니다.
읽기 전용 또는 변경 가능
접근 시 항상 상수 값을 반환하는 const 객체이거나 필요한 컨테이너 API를 사용할 수 없는 범위의 경우 QRangeModel은 쓰기 접근 API를 구현하여 아무것도 수행하지 않고 false
을 반환합니다. std::array
을 사용하는 예제에서는 C++ 배열의 항목 수가 고정되어 있으므로 모델이 행을 추가하거나 제거할 수 없습니다. 그러나 setData()를 사용하여 값을 변경할 수 있으며 사용자는 목록 보기에서 값 편집을 트리거할 수 있습니다. 배열을 const로 만들면 값도 읽기 전용이 됩니다.
const std::array<int, 5> numbers = {1, 2, 3, 4, 5};
다음과 같이 요소 유형이 const인 경우에도 값은 읽기 전용입니다.
std::array<const int, 5> numbers = {1, 2, 3, 4, 5};
std::vector
을 사용한 위의 예제에서 모델은 행을 추가하거나 제거할 수 있으며 데이터를 변경할 수 있습니다. 범위를 상수 참조로 전달하면 모델이 읽기 전용이 됩니다.
QRangeModel model(std::cref(numbers));
참고: 범위의 값이 상수인 경우 QAbstractItemModel API를 통해 열과 행을 제거하거나 삽입할 수 없습니다. 보다 세분화된 제어를 위해서는 the C++ tuple protocol 을 구현하세요.
행과 열
범위의 요소는 모델의 행으로 해석됩니다. 이러한 행 요소의 유형에 따라 QRangeModel은 범위를 목록, 표 또는 트리로 표시합니다.
행 요소가 단순한 값인 경우 범위는 목록으로 표시됩니다.
QList<int> numbers = {1, 2, 3, 4, 5}; QRangeModel model(numbers); // columnCount() == 1 QListView listView; listView.setModel(&model);
행 요소의 유형이 벡터, 목록 또는 배열과 같은 반복 가능한 범위인 경우 범위는 테이블로 표시됩니다.
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);
행 유형이 표준 C++ 컨테이너 API resize()
, insert()
, erase()
를 제공하는 경우 insertColumns() 및 removeColumns()를 통해 열을 추가 및 제거할 수 있습니다. 모든 행은 동일한 수의 열을 가져야 합니다.
행으로 사용하는 구조체와 가젯
행 유형이 the C++ tuple protocol 을 구현하는 경우 범위는 고정된 수의 열이 있는 테이블로 표시됩니다.
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);
C++ 타입에 대한 튜플 프로토콜을 구현하는 것보다 더 쉽고 유연한 대안은 Qt의 메타 객체 시스템을 사용하여 프로퍼티가 있는 타입을 선언하는 것입니다. 이는 gadget 또는 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; };
QObject 서브클래스를 사용하면 프로퍼티를 바인딩할 수 있거나 변경 알림 신호를 가질 수 있습니다. 그러나 항목에 QObject 인스턴스를 사용하면 상당한 메모리 오버헤드가 발생합니다.
Qt 가젯이나 객체를 사용하는 것이 튜플 프로토콜을 구현하는 것보다 더 편리하고 유연할 수 있습니다. 또한 이러한 유형은 QML 내에서 직접 액세스할 수 있습니다. 그러나 속성 시스템을 통한 액세스는 약간의 런타임 오버헤드가 발생합니다. 성능이 중요한 모델의 경우 액세스 코드의 컴파일 타임 생성을 위해 튜플 프로토콜을 구현하는 것을 고려하세요.
다중 역할 항목
data(), setData(), clearItemData() 등의 구현이 작동하는 항목의 유형은 위의 gridOfNumbers
예제에서처럼 전체 모델에서 동일할 수 있습니다. 그러나 numberNames
예제처럼 범위는 열마다 다른 항목 유형을 가질 수도 있습니다.
기본적으로 Qt::DisplayRole 및 Qt::EditRole 역할에 값이 사용됩니다. 대부분의 뷰에서는 convertible to and from a QString 값이 사용됩니다(하지만 사용자 지정 델리게이트를 사용하면 더 유연하게 사용할 수 있습니다).
여러 역할을 가진 연관 컨테이너
항목이 int
, Qt::ItemDataRole 또는 QString 를 키 유형으로 사용하고 QVariant 를 매핑된 유형으로 사용하는 연관 컨테이너인 경우 QRangeModel은 해당 컨테이너를 여러 역할에 대한 데이터 저장소로 해석합니다. data () 및 setData() 함수는 컨테이너에서 매핑된 값을 반환하고 수정하며, setItemData()는 제공된 모든 값을 수정하고, itemData()는 저장된 모든 값을 반환하며, clearItemData()는 전체 컨테이너를 지웁니다.
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);
키로 사용하기에 가장 효율적인 데이터 유형은 Qt::ItemDataRole 또는 int
입니다. int
를 사용하는 경우 itemData()는 컨테이너를 그대로 반환하므로 데이터의 복사본을 만들 필요가 없습니다.
다중 역할 항목으로서의 가젯 및 개체
가젯 및 QObject 유형도 다중 역할 항목으로 표현할 수 있습니다. 이러한 항목의 속성은 name of a role 이 일치하는 역할에 사용됩니다. 모든 항목이 동일한 유형의 가젯 또는 QObject 을 보유하는 경우 QRangeModel의 roleNames() 구현은 해당 유형의 속성 목록을 반환합니다.
class ColorEntry { Q_GADGET Q_PROPERTY(QString display MEMBER m_colorName) Q_PROPERTY(QColor decoration READ decoration) Q_PROPERTY(QString toolTip READ toolTip) public: ColorEntry(const QString &color = {}) : m_colorName(color) {} QColor decoration() const { return QColor::fromString(m_colorName); } QString toolTip() const { return QColor::fromString(m_colorName).name(); } private: QString m_colorName; };
테이블에서 사용되는 경우 이것이 가젯의 기본 표현입니다:
QList<QList<ColorEntry>> colorTable; // ... QRangeModel colorModel(colorTable); QTableView table; table.setModel(&colorModel);
그러나 목록에 사용되는 경우 이러한 유형은 기본적으로 다중 열 행으로 표시되며 각 속성은 별도의 열로 표시됩니다. 가젯이 목록에서 다중 역할 항목으로 표시되도록 하려면 static constexpr auto rowCategory
멤버 변수를 MultiRoleItem 으로 설정하여 가젯을 다중 역할 유형으로 선언하고 QRoleModel::RowOptions을 전문화하여 가젯을 다중 역할 유형으로 선언하세요.
class ColorEntry { Q_GADGET Q_PROPERTY(QString display MEMBER m_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; };
이러한 유형을 단일 요소 튜플로 래핑하여 목록을 단일 열이 있는 테이블로 바꿀 수도 있습니다:
const QStringList colorNames = QColor::colorNames(); QList<std::tuple<ColorEntry>> colors; // ... QRangeModel colorModel(colors); QListView list; list.setModel(&colorModel);
이 경우 목록 데이터의 요소에 직접 액세스하려면 std::get
을 사용해야 합니다:
ColorEntry firstEntry = std::get<0>(colors.at(0));
또는 구조화된 바인딩을 사용해야 합니다:
auto [firstEntry] = colors.at(0);
값 또는 포인터로서의 행
지금까지의 예제에서는 항상 값을 보유하는 범위와 함께 QRangeModel을 사용했습니다. QRangeModel은 스마트 포인터를 포함하여 포인터를 보유하는 범위에서도 작동할 수 있습니다. 이를 통해 QRangeModel은 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);
값과 마찬가지로 행의 유형은 범위가 목록, 테이블 또는 트리로 표시되는지 여부를 정의합니다. QRangeModel::RowOptions 템플릿이 유형을 다중 역할 항목으로 선언하도록 특수화되지 않는 한, QObject인 행은 각 속성을 열로 표시합니다.
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));
참고: 범위가 원시 포인터를 보유하는 경우 범위의 포인터 또는 참조 래퍼로 QRangeModel을 구성해야 합니다. 그렇지 않으면 데이터의 소유권이 모호해지고 범위의 복사본이 여전히 동일한 실제 행 데이터에서 작동하여 예기치 않은 부작용이 발생할 수 있습니다.
QRangeModel 서브클래스화하기
QRangeModel을 서브클래싱하면 범위의 데이터 유형과 구조를 고려한 편리한 API를 추가할 수 있습니다.
class NumbersModel : public QRangeModel { std::vector<int> m_numbers; public: NumbersModel(const std::vector<int> &numbers) : QRangeModel(std::ref(m_numbers)) , m_numbers(numbers) { }
이렇게 할 때는 범위를 비공개 멤버로 추가하고 해당 멤버에 대한 참조 래퍼 또는 포인터를 사용하여 QRangeModel 생성자를 호출합니다. 이렇게 하면 데이터가 적절하게 캡슐화되고 직접 액세스가 방지됩니다.
void setNumber(int idx, int number) { setData(index(idx, 0), QVariant::fromValue(number)); } int number(int idx) const { return m_numbers.at(idx); } };
멤버 함수를 추가하여 데이터에 유형 안전 액세스를 제공하고 QAbstractItemModel API를 사용하여 범위를 수정하는 모든 작업을 수행합니다. 읽기 전용 액세스는 데이터 구조에 직접 작업할 수 있습니다.
데이터 트리
QRangeModel은 데이터 구조를 트리 모델로 나타낼 수 있습니다. 이러한 트리 데이터 구조는 동형이어야 합니다. 트리의 모든 수준에서 하위 행 목록은 트리 자체와 정확히 동일한 표현을 사용해야 합니다. 또한 행 유형은 가젯 또는 QObject 유형 또는 {C++ 튜플 프로토콜}을 구현하는 유형과 같이 정적 크기여야 합니다.
이러한 데이터를 트리로 표현하려면 QRangeModel이 데이터 구조를 탐색할 수 있어야 합니다. 주어진 행에 대해 모델은 부모 행과 자식의 선택적 범위(스팬)를 검색할 수 있어야 합니다. 이러한 트래버스 함수는 행 유형을 통해 암시적으로 제공되거나 명시적인 프로토콜 유형을 통해 제공될 수 있습니다.
암시적 트리 트래버스 프로토콜
class TreeRow; using Tree = std::vector<TreeRow>;
트리 자체는 TreeRow
값의 벡터입니다. 행에 값 또는 항목의 포인터를 사용할지 여부에 대한 고려 사항은 Tree Rows as pointers or values 을 참조하세요.
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
행 클래스는 위에서 설명한 모든 고정 크기 유형(튜플 프로토콜을 구현하는 유형, 가젯 또는 QObject)이 될 수 있습니다. 이 예에서는 가젯을 사용합니다.
각 행 항목은 부모 행에 대한 포인터와 자식 행의 선택적 범위를 유지해야 합니다. 이 범위는 트리 자체에 사용된 범위 구조와 동일해야 합니다.
행 유형을 기본 구성 가능으로 설정하는 것은 선택 사항이며, 예를 들어 insertRow() 또는 moveRows() 구현에서 모델이 새 행 데이터 요소를 구성할 수 있습니다.
// tree traversal protocol implementation const TreeRow *parentRow() const { return m_parent; } const std::optional<Tree> &childRows() const { return m_children; }
그런 다음 트리 탐색 프로토콜을 행 데이터 타입의 멤버 함수로 구현할 수 있습니다. const parentRow()
함수는 const 행 항목에 대한 포인터를 반환해야 하고, childRows()
함수는 선택적 하위 범위를 보유할 수 있는 std::optional
에 대한 참조를 반환해야 합니다.
이 두 함수는 모델이 읽기 전용 데이터 구조로 트리를 탐색하는 데 충분합니다. 사용자가 뷰에서 데이터를 편집하고 모델이 insertRows(), removeRows() 및 moveRows()와 같은 변경 모델 API를 구현할 수 있도록 하려면 쓰기 액세스를 위한 추가 함수를 구현해야 합니다:
void setParentRow(TreeRow *parent) { m_parent = parent; } std::optional<Tree> &childRows() { return m_children; }
이 모델은 setParentRow()
함수와 변경 가능한 childRows()
오버로드를 호출하여 기존 트리 분기로 행을 이동하거나 삽입하고, 이전 값이 유효하지 않은 경우 부모 포인터를 업데이트합니다. childRows()
의 논컨스트 오버로드는 행 데이터에 대한 쓰기 액세스를 추가로 제공합니다.
참고: 이 모델은 행의 부모를 설정하고, 이전 부모에서 해당 행을 제거하고, 새 부모의 자식 목록에 추가하는 작업을 별도의 단계로 수행합니다. 이렇게 하면 프로토콜 인터페이스가 작게 유지됩니다.
... // 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; } };
나머지 클래스 구현은 모델과 관련이 없지만 addChild()
헬퍼는 트리의 초기 상태를 편리하게 구성할 수 있는 방법을 제공합니다.
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("...");
이러한 범위의 인스턴스로 인스턴스화된 QRangeModel은 데이터를 트리로 표현합니다.
// instantiate the model with a pointer to the tree, not a copy! QRangeModel model(&tree); QTreeView view; view.setModel(&model);
별도의 클래스에서 트리 트래버스 프로토콜
트리 순회 프로토콜은 별도의 클래스에서도 구현할 수 있습니다.
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; } };
이 프로토콜 구현의 인스턴스를 QRangeModel 생성자에 전달합니다:
QRangeModel model(&tree, TreeTraversal{});
트리 행을 포인터 또는 값으로
데이터 범위의 행 유형은 값 또는 포인터일 수 있습니다. 위 코드에서는 트리 행을 벡터의 값으로 사용했기 때문에 명시적인 메모리 관리를 하지 않아도 됩니다. 그러나 연속된 메모리 블록으로서의 벡터는 스토리지를 재할당해야 하거나 요소를 삽입하거나 제거할 때 모든 이터레이터와 참조를 무효화합니다. 이는 벡터 내 부모 행의 위치인 부모 항목에 대한 포인터에 영향을 미칩니다. 이 부모(및 그 안의 항목을 참조하는 QPersistentModelIndex 인스턴스)가 유효하게 유지되도록 하면 상당한 성능 오버헤드가 발생할 수 있습니다. QRangeModel 구현은 범위를 수정할 때 범위에 대한 모든 참조가 유효하지 않다고 가정해야 합니다.
또는 행 포인터의 범위를 트리 유형으로 사용할 수도 있습니다:
struct TreeRow; using Tree = std::vector<TreeRow *>;
이 경우 연산자 new
를 사용하여 모든 TreeRow 인스턴스를 명시적으로 할당하고 소멸자를 delete
로 구현하여 자식 벡터의 모든 항목을 소멸시켜야 합니다.
구조체 TreeRow { Q_GADGETpublic: TreeRow(const QString &value = {}) : m_value(value) {} ~TreeRow() { if (m_children) qDeleteAll(*m_children); } // 이동 전용TreeRow(TreeRow &&) = default; TreeRow &operator=(TreeRow &&) = default; // 템플릿 채우기 헬퍼<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 구조체 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");
이 데이터를 트리로 표현하는 모델을 구축하기 전에 트리 탐색 프로토콜도 구현해야 합니다.
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; } };
포인터의 가변 트리에 대한 명시적 프로토콜 구현은 newRow()
와 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(); }
모델은 insertRows()에서 새 행을 생성할 때와 removeRows()에서 행을 제거할 때 이러한 함수를 호출합니다. 또한 모델에 데이터에 대한 소유권이 있는 경우 모델이 파괴되면 최상위 행도 모두 삭제합니다. 이 예제에서는 트리를 모델 안으로 이동하므로 더 이상 트리에 대한 작업을 수행하지 않아야 한다는 점에 유의하세요. 행 포인터가 있는 트리 데이터를 모델 내부로 이동하여 생성된 QRangeModel은 데이터의 소유권을 가지며, 소멸자에서 행 포인터를 삭제합니다.
행 포인터를 행으로 사용하면 약간의 메모리 할당 및 관리 오버헤드가 발생합니다. 그러나 행 항목에 대한 참조는 범위 내에서 이동하거나 범위가 재할당되더라도 안정적으로 유지됩니다. 따라서 insertRows(), removeRows() 또는 moveRows()를 사용할 때 모델 구조를 수정하는 데 드는 비용을 크게 줄일 수 있습니다.
각 선택 사항에는 성능 및 메모리 오버헤드 절충안이 다릅니다. 가장 적합한 옵션은 정확한 사용 사례와 사용되는 데이터 구조에 따라 달라집니다.
C++ 튜플 프로토콜
위의 numberNames
예제에서 볼 수 있듯이 행 유형은 튜플일 수 있으며, 실제로 튜플 프로토콜을 구현하는 모든 유형이 튜플일 수 있습니다. 이 프로토콜은 std::tuple_size
및 std::tuple_element
을 특수화하고 자격이 없는 get
함수를 오버로드하여 구현합니다. 사용자 정의 행 유형에 대해 이렇게 하면 기존 구조화된 데이터를 Qt의 모델/뷰 프레임워크에서 사용할 수 있습니다.
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>())); }; }
위의 구현에서 Book
유형의 title
및 author
값은 const
으로 반환되므로 모델은 이 두 열의 항목을 읽기 전용으로 플래그 지정합니다. 사용자는 편집을 트리거할 수 없으며 setData()는 아무 작업도 수행하지 않고 거짓을 반환합니다. summary
및 rating
의 경우 구현은 책과 동일한 값 범주를 반환하므로 get
가 Book
에 대한 변경 가능한 참조로 호출되면 해당 변수의 변경 가능한 참조를 반환합니다. 이 모델은 사용자와 프로그래밍 방식의 액세스를 위해 해당 열을 편집할 수 있도록 합니다.
참고: 위의 get
구현에는 C++23이 필요합니다.
모델/보기 프로그래밍도참조하세요 .
멤버 유형 문서
enum class QRangeModel::RowCategory
이 열거형은 QRangeModel 이 구성한 범위의 요소를 어떻게 표시해야 하는지 설명합니다.
Constant | 값 | Description |
---|---|---|
QRangeModel::RowCategory::Default | 0 | QRangeModel 행을 표시하는 방법을 결정합니다. |
QRangeModel::RowCategory::MultiRoleItem | 1 | QRangeModel 는 1차원 범위에서 사용되는 경우에도 메타 객체가 있는 항목을 다중 역할 항목으로 표시합니다. |
유형에 맞게 RowOptions 템플릿을 특수화하고 이 열거형 값 중 하나를 사용하여 static constexpr auto rowCategory
공용 멤버 변수를 추가하세요.
RowOptions도 참조하세요 .
속성 문서
roleNames : QHash<int, QByteArray>
이 속성은 모델의 역할 이름을 보유합니다.
범위의 모든 열이 동일한 유형이고 해당 유형이 메타 객체를 제공하는 경우(즉, 가젯 또는 QObject 하위 클래스인 경우) 이 속성에는 해당 유형의 속성 이름이 Qt::UserRole 이상의 Qt::ItemDataRole 값에 매핑된 값이 포함됩니다. 또한 "modelData" 역할은 가젯 또는 QObject 인스턴스에 대한 액세스를 제공합니다.
이 속성을 비어 있지 않은 매핑으로 명시적으로 설정하여 이 기본 동작을 재정의할 수 있습니다. 이 속성을 비어 있는 매핑으로 설정하거나 resetRoleNames()를 사용하면 기본 동작이 복원됩니다.
함수 액세스
virtual QHash<int, QByteArray> | roleNames() const override |
void | setRoleNames(const QHash<int, QByteArray> &names) |
void | resetRoleNames() |
알림 신호:
void | roleNamesChanged() |
QAbstractItemModel::roleNames()도 참조하세요 .
멤버 함수 문서
[explicit]
template <typename Range, typename Protocol, int = true> QRangeModel::QRangeModel(Range &&range, Protocol &&protocol, QObject *parent = nullptr)
[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)
range 의 데이터에서 작동하는 QRangeModel 인스턴스를 구축합니다. range 은 std::begin
과 std::end
을 사용할 수 있는 순차적 범위여야 합니다. protocol 이 제공되면 모델은 프로토콜 구현을 사용하여 범위를 트리로 표현합니다. 모델 인스턴스는 parent 의 자식이 됩니다.
range 은 포인터 또는 참조 래퍼일 수 있으며, 이 경우 모델 API(예: setData() 또는 insertRow())를 변경하면 참조된 범위 인스턴스의 데이터가 수정됩니다. range 가 값(또는 모델 내로 이동)인 경우 모델에서 방출되는 신호에 연결하여 데이터 변경에 응답합니다.
QRangeModel 는 작성되는 동안 range 에 액세스하지 않습니다. 따라서 아직 완전히 구성되지 않은 범위 객체에 대한 포인터나 참조를 이 생성자에 전달하는 것이 합법적입니다(예: subclassing QRangeModel).
range 이 모델에 이동된 경우 모델 소멸 시 범위와 그 안의 모든 데이터가 소멸됩니다.
참고: 모델이 범위 개체에 대한 소유권을 가지지 않는 한, 모델이 생성되어 뷰에 전달된 후에는 range 을 직접 수정해서는 안 됩니다. 이러한 수정은 모델 사용자(다른 모델 또는 보기)를 모델과 동기화하는 데 필요한 신호를 보내지 않으므로 일관되지 않은 결과, 정의되지 않은 동작 및 충돌을 초래할 수 있습니다.
[override virtual noexcept]
QRangeModel::~QRangeModel()
QRangeModel 을 파괴합니다.
모델이 생성된 범위에는 액세스하지 않으며, 모델이 이동된 범위에서 생성된 경우에만 파괴합니다.
[override virtual]
QModelIndex QRangeModel::buddy(const QModelIndex &index) const
재구현합니다: 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
재 구현합니다: QAbstractItemModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const.
[override virtual]
bool QRangeModel::canFetchMore(const QModelIndex &parent) const
재구현합니다: QAbstractItemModel::canFetchMore(const QModelIndex &parent) const.
[override virtual]
bool QRangeModel::clearItemData(const QModelIndex &index)
재구현합니다: QAbstractItemModel::clearItemData(const QModelIndex &index).
index 범위에 저장된 값을 기본값으로 구성된 값으로 바꿉니다.
읽기 전용 범위 또는 the C++ tuple protocol 을 구현하는 행 유형의 읽기 전용 열에서 작동하는 모델의 경우 이 구현은 false
을 즉시 반환합니다.
[override virtual]
int QRangeModel::columnCount(const QModelIndex &parent = {}) const
재구현합니다: QAbstractItemModel::columnCount(const QModelIndex &parent) const.
모델의 열 수를 반환합니다. 이 함수는 모든 parent 인덱스에 대해 동일한 값을 반환합니다.
정적 크기의 행 유형에서 작동하는 모델의 경우 이 반환 값은 모델의 수명 기간 동안 항상 동일합니다. 동적 크기의 행 유형에서 작동하는 모델의 경우 첫 번째 행에 있는 항목 수를 반환하거나 모델에 행이 없는 경우 0을 반환합니다.
rowCount 및 insertColumns()도 참조하세요 .
[override virtual]
QVariant QRangeModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
재구현합니다: QAbstractItemModel::data(const QModelIndex &index, int role) const.
index 에서 참조하는 범위의 값에 대해 지정된 role 에 저장된 데이터를 반환합니다.
해당 인덱스의 항목 유형이 int
, Qt::ItemDataRole, 또는 QString 에서 QVariant 로 매핑되는 연관 컨테이너인 경우 해당 컨테이너에서 역할 데이터를 조회하여 반환합니다.
항목이 가젯 또는 QObject 인 경우 구현은 roleNames() 매핑의 role 항목과 일치하는 항목의 속성 값을 반환합니다.
그렇지 않으면 구현은 Qt::DisplayRole
또는 Qt::EditRole
에 대해 QVariant::fromValue()
을 통해 항목에서 구성된 QVariant 을 반환합니다. 다른 역할의 경우 구현은 잘못된 (기본적으로 구성된) QVariant 을 반환합니다.
Qt::ItemDataRole, setData() 및 headerData()도 참조하세요 .
[override virtual]
bool QRangeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
재구현합니다: QAbstractItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent).
[override virtual protected]
bool QRangeModel::event(QEvent *event)
다시 구현합니다: QObject::event(QEvent *e).
[override virtual protected]
bool QRangeModel::eventFilter(QObject *object, QEvent *event)
다시 구현합니다: QObject::eventFilter(QObject *watched, QEvent *event).
[override virtual]
void QRangeModel::fetchMore(const QModelIndex &parent)
재구현합니다: QAbstractItemModel::fetchMore(const QModelIndex &parent).
[override virtual]
Qt::ItemFlags QRangeModel::flags(const QModelIndex &index) const
재구현합니다: QAbstractItemModel::flags(const QModelIndex &index) const.
주어진 index 에 대한 항목 플래그를 반환합니다.
이 구현은 항목(ItemIsEnabled
)을 활성화하고 선택(ItemIsSelectable
)을 허용하는 플래그 조합을 반환합니다. 변경 가능한 데이터가 있는 범위에서 작동하는 모델의 경우 항목을 편집할 수 있는 플래그도 설정합니다 (ItemIsEditable
).
Qt::ItemFlags 를참조하세요 .
[override virtual]
bool QRangeModel::hasChildren(const QModelIndex &parent = QModelIndex()) const
재구현합니다: QAbstractItemModel::hasChildren(const QModelIndex &parent) const.
[override virtual]
QVariant QRangeModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
재구현합니다: QAbstractItemModel::headerData(int section, Qt::오리엔테이션 방향, int 역할) const.
지정된 role 와 section 에 대한 데이터를 지정된 orientation 헤더로 반환합니다.
가로 헤더의 경우 섹션 번호는 열 번호에 해당합니다. 마찬가지로 세로 헤더의 경우 섹션 번호는 행 번호에 해당합니다.
가로 머리글 및 Qt::DisplayRole role , 배열을 행 유형으로 사용하는 범위에서 작동하는 모델은 section 을 반환합니다. 행 유형이 튜플인 경우 구현은 section 에서 유형 이름을 반환합니다. 가젯 또는 QObject 유형인 행의 경우 이 함수는 section 의 인덱스에 있는 속성 이름을 반환합니다.
세로 헤더의 경우 이 함수는 항상 QAbstractItemModel 의 기본 구현 결과를 반환합니다.
Qt::ItemDataRole, setHeaderData() 및 QHeaderView 를참조하십시오 .
[override virtual]
QModelIndex QRangeModel::index(int row, int column, const QModelIndex &parent = {}) const
재구현합니다: QAbstractItemModel::index(int row, int column, const QModelIndex &parent) const.
parent 에서 row 및 column 의 모델 항목의 인덱스를 반환합니다.
유효한 부모를 전달하면 목록 및 테이블 범위에서 작동하는 모델에 대해 유효하지 않은 인덱스가 생성됩니다.
parent()도 참조하세요 .
[override virtual]
bool QRangeModel::insertColumns(int column, int count, const QModelIndex &parent = {})
재구현합니다: QAbstractItemModel::insertColumns(int column, int count, const QModelIndex &parent).
count column 의 항목 앞에 의 범위의 모든 행에 빈 열을 삽입합니다. 성공하면 을 반환하고, 그렇지 않으면 을 반환합니다. parent true
false
참고: 동적 크기 행 유형은 insert(const_iterator, size_t, value_type)
멤버 함수를 제공해야 합니다.
읽기 전용 범위 또는 정적 크기의 행 유형(예: 튜플, 배열 또는 구조체)이 있는 범위에서 작동하는 모델의 경우 이 구현은 아무 작업도 수행하지 않고 즉시 false
을 반환합니다. 트리 모델의 경우 항상 그렇습니다.
[override virtual]
bool QRangeModel::insertRows(int row, int count, const QModelIndex &parent = {})
재구현합니다: QAbstractItemModel::insertRows(int row, int count, const QModelIndex &parent).
주어진 row 앞에 count 빈 행을 parent 의 범위에 삽입합니다. 성공하면 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
참고: 범위의 크기를 동적으로 조정하고 insert(const_iterator, size_t, value_type)
멤버 함수를 제공해야 합니다.
읽기 전용 또는 정적으로 크기가 지정된 범위(예: 배열)에서 작동하는 모델의 경우 이 구현은 아무 작업도 수행하지 않고 false
을 즉시 반환합니다.
참고: 동적 크기의 열 유형이 있는 범위의 경우 열에 resize(size_t)
멤버 함수를 제공해야 합니다.
[override virtual]
QMap<int, QVariant> QRangeModel::itemData(const QModelIndex &index) const
재구현합니다: QAbstractItemModel::itemData(const QModelIndex &index) const.
주어진 index 에 있는 항목에 대해 모델에서 미리 정의된 모든 역할에 대한 값이 있는 맵을 반환합니다.
해당 index 의 항목 유형이 int
, Qt::ItemDataRole, 또는 QString 에서 QVariant 로 매핑되는 연관 컨테이너인 경우 해당 컨테이너의 데이터가 반환됩니다.
항목 유형이 가젯 또는 QObject 하위 클래스인 경우 role name 과 일치하는 해당 속성 값이 반환됩니다.
항목이 연관 컨테이너, 가젯 또는 QObject 서브클래스가 아닌 경우 기본 클래스 구현을 호출합니다.
setItemData(), Qt::ItemDataRole, data()도 참조하세요 .
[override virtual]
QModelIndexList QRangeModel::match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const
재 구현합니다: QAbstractItemModel::match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const.
[override virtual]
QMimeData *QRangeModel::mimeData(const QModelIndexList &indexes) const
재구현합니다: QAbstractItemModel::mimeData(const QModelIndexList &indexes) const.
[override virtual]
QStringList QRangeModel::mimeTypes() const
재구현합니다: QAbstractItemModel::mimeTypes() const.
[override virtual]
bool QRangeModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationColumn)
재구현합니다: QAbstractItemModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild).
부모 sourceParent 아래의 지정된 sourceColumn 열로 시작하는 count 열을 부모 destinationParent 아래의 destinationColumn 열로 이동합니다.
열이 성공적으로 이동하면 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
[override virtual]
bool QRangeModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationRow)
재구현합니다: QAbstractItemModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild).
부모 sourceParent 아래의 지정된 sourceRow 행으로 시작하는 count 행을 부모 destinationParent 아래의 destinationRow 행으로 이동합니다.
행이 성공적으로 이동하면 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
[override virtual]
void QRangeModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const
재구현합니다: QAbstractItemModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const.
[override virtual]
QModelIndex QRangeModel::parent(const QModelIndex &child) const
재구현합니다: QAbstractItemModel::parent(const QModelIndex &index) const.
child 인덱스에서 항목의 부모를 반환합니다.
이 함수는 목록 및 테이블 범위에서 작동하는 모델에 대해 항상 잘못된 인덱스를 생성합니다. 트리에서 작동하는 모델의 경우 이 함수는 트리 탐색 프로토콜의 parent() 구현에서 반환한 행 항목의 인덱스를 반환합니다.
index() 및 hasChildren()도 참조하세요 .
[override virtual]
bool QRangeModel::removeColumns(int column, int count, const QModelIndex &parent = {})
재구현합니다: QAbstractItemModel::removeColumns(int column, int count, const QModelIndex &parent).
column 에 있는 항목에서 parent 에 있는 범위의 모든 행에서 count 열을 제거합니다. 성공하면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다.
참고: 동적 크기 행 유형은 erase(const_iterator, size_t)
멤버 함수를 제공해야 합니다.
읽기 전용 범위 또는 정적 크기의 행 유형(예: 튜플, 배열 또는 구조체)이 있는 범위에서 작동하는 모델의 경우 이 구현은 아무 작업도 수행하지 않고 false
을 즉시 반환합니다. 트리 모델의 경우 항상 그렇습니다.
[override virtual]
bool QRangeModel::removeRows(int row, int count, const QModelIndex &parent = {})
재구현합니다: QAbstractItemModel::removeRows(int row, int count, const QModelIndex &parent).
주어진 row 부터 시작하여 parent 범위에서 count 행을 제거합니다. 성공하면 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
참고: 범위는 동적으로 크기를 조정하고 erase(const_iterator, size_t)
멤버 함수를 제공해야 합니다.
읽기 전용 또는 정적으로 크기가 지정된 범위(예: 배열)에서 작동하는 모델의 경우 이 구현은 아무 작업도 수행하지 않고 false
을 즉시 반환합니다.
[override virtual protected slot]
void QRangeModel::resetInternalData()
다시 구현합니다: QAbstractItemModel::resetInternalData().
[override virtual]
QHash<int, QByteArray> QRangeModel::roleNames() const
재구현합니다: QAbstractItemModel::roleNames() const.
참고: QRangeModel 서브클래스에서 이 함수를 재정의할 수 있지만 프로퍼티의 동작이 손상될 수 있습니다.
참고: roleNames 프로퍼티에 대한 게터 함수.
setRoleNames()도 참조하세요 .
[override virtual]
int QRangeModel::rowCount(const QModelIndex &parent = {}) const
재구현합니다: QAbstractItemModel::rowCount(const QModelIndex &parent) const.
주어진 parent 아래의 행 수를 반환합니다. 이 값은 잘못된 parent 인덱스의 루트 범위에 있는 항목 수입니다.
parent 인덱스가 유효하면 이 함수는 목록 및 테이블 범위에서 작동하는 모델에 대해 항상 0을 반환합니다. 트리의 경우 트리 탐색 프로토콜의 childRows() 구현에서 반환하는 범위의 크기를 반환합니다.
columnCount(), insertRows() 및 hasChildren()도 참조하세요 .
[override virtual]
bool QRangeModel::setData(const QModelIndex &index, const QVariant &data, int role = Qt::EditRole)
재구현합니다: QAbstractItemModel::setData(const Q모델인덱스 &index, const Q변수 &value, int 역할).
index 에 있는 항목의 role 데이터를 data 로 설정합니다.
해당 index 의 항목 유형이 int
, Qt::ItemDataRole 또는 QString 에서 QVariant 로 매핑되는 연관 컨테이너인 경우 data 는 role 에서 지정한 키에 대해 해당 컨테이너에 저장됩니다.
항목이 가젯 또는 QObject 인 경우 data 은 roleNames() 매핑의 role 항목과 일치하는 항목의 속성에 기록됩니다. 속성이 발견되고 data 에 필요한 유형으로 변환할 수 있는 값이 저장되어 있으면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다.
그렇지 않으면 이 구현은 data 의 값을 Qt::DisplayRole
및 Qt::EditRole
범위의 index 에 있는 항목에 할당하고 true
를 반환합니다. 다른 역할의 경우 구현은 false
을 반환합니다.
읽기 전용 범위 또는 the C++ tuple protocol 을 구현하는 행 유형의 읽기 전용 열에서 작동하는 모델의 경우 이 구현은 false
을 즉시 반환합니다.
data()도 참조하세요 .
[override virtual]
bool QRangeModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &data, int role = Qt::EditRole)
재구현합니다: QAbstractItemModel::setHeaderData(int section, Qt::오리엔테이션 오리엔테이션, const QVariant &value, int role).
headerData()도 참조하십시오 .
[override virtual]
bool QRangeModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &data)
재구현합니다: QAbstractItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles).
index 의 항목 유형이 int
또는 Qt::ItemDataRole 에서 QVariant 로 매핑되는 연관 컨테이너인 경우 data 의 항목이 해당 컨테이너에 저장됩니다. 연관 컨테이너가 QString 에서 QVariant 으로 매핑되는 경우 data 에 있는 값 중 role names 테이블에 매핑이 있는 값만 저장됩니다.
항목 유형이 가젯 또는 QObject 하위 클래스인 경우 role name 과 일치하는 속성은 data 에 있는 해당 값으로 설정됩니다.
data 에 항목이 없는 역할은 수정되지 않습니다.
복사할 수 있는 항목 유형의 경우 이 구현은 트랜잭션이며 data 의 모든 항목을 저장할 수 있는 경우 true를 반환합니다. 어떤 항목도 업데이트할 수 없는 경우 원래 컨테이너는 전혀 수정되지 않으며 함수는 false를 반환합니다.
항목이 연관 컨테이너, 가젯 또는 QObject 서브클래스가 아닌 경우 data 의 각 항목에 대해 setData()를 호출하는 기본 클래스 구현을 호출합니다.
itemData(), setData() 및 Qt::ItemDataRole도 참조하세요 .
[override virtual]
QModelIndex QRangeModel::sibling(int row, int column, const QModelIndex &index) const
재구현합니다: QAbstractItemModel::sibling(int row, int column, const QModelIndex &index) const.
index 에 있는 항목에 대해 row 및 column 의 형제 항목을 반환하거나 해당 위치에 형제 항목이 없으면 유효하지 않은 QModelIndex 을 반환합니다.
이 구현은 index 의 parent()를 거치는 것보다 훨씬 빠릅니다.
index(), QModelIndex::row() 및 QModelIndex::column()도 참조하세요 .
[override virtual]
void QRangeModel::sort(int column, Qt::SortOrder order = Qt::AscendingOrder)
재구현합니다: QAbstractItemModel::sort(int column, Qt::SortOrder 순서).
[override virtual]
QSize QRangeModel::span(const QModelIndex &index) const
재구현합니다: QAbstractItemModel::span(const QModelIndex &index) const.
[override virtual]
Qt::DropActions QRangeModel::supportedDragActions() const
재구현합니다: QAbstractItemModel::supportedDragActions() const.
[override virtual]
Qt::DropActions QRangeModel::supportedDropActions() const
재구현합니다: QAbstractItemModel::supportedDropActions() const.
© 2025 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.