标签: qmodelindex

QTableView:如何正确创建QModelIndex?

我正试图在特定单元格上进入编辑模式,如下所示:

void MainWindow::on_addButton_released() {
    tm->addRow();
    tableView->scrollToBottom();
    int ec=tm->firstWritableColumn();
    int r=tm->rowCount(QModelIndex());
    QModelIndex id = tm->index(r, ec, QModelIndex());
    tableView->setCurrentIndex(id);
    tableView->edit(id);
    qDebug() << "row:" << r << " col:" << ec << "index:" << id;
}
Run Code Online (Sandbox Code Playgroud)

我的模型创建了一个这样的索引:

QModelIndex TableModel::index(int row,int column,QModelIndex parent) const {
    Q_UNUSED(parent);
    return createIndex(row,column,0);
}
Run Code Online (Sandbox Code Playgroud)

调试输出如下所示:

row: 9  col: 1 index: QModelIndex(9,1,0x0,TableModel(0xbf3f50) )  
Run Code Online (Sandbox Code Playgroud)

我很确定索引在某种程度上是无效的,因为setCurrentIndex()它似乎不起作用.

qt qtableview qmodelindex

11
推荐指数
1
解决办法
2万
查看次数

在QTreeView中更容易找到QModelIndex的(可视)位置

我有兴趣计算一个节点的物理位置,QTreeView但是找不到这样做的方法(除了自己计算它,考虑到鲁棒性,这很麻烦且容易出错QTreeView).

有没有一种标准方法可以找到与a相关的数据的绘制位置QModelIndex(类似于将indexAt()位置映射到a的方式QModelIndex)?

c++ model-view-controller qt qtreeview qmodelindex

9
推荐指数
1
解决办法
3202
查看次数

如何将QModelIndex与新行相关联?

我已经制作了一个QAbstractListModel模型索引包含我绝对需要的指针来处理数据.我这样添加数据:

void PointListModel::addPoint(int frameNumber, QPoint const& pos)
{
    PointItem *pointItem = new PointItem( frameNumber, pos );
    QModelIndex newRow = this->createIndex( m_points.count(), 0, pointItem );

    qDebug() << newRow.internalPointer();

    beginInsertRows( newRow, m_points.count(), m_points.count() );
    m_points.insert( m_points.count( ), pointItem );
    endInsertRows();

    emit pointAdded( pointItem, pos );
}
Run Code Online (Sandbox Code Playgroud)

直到后来才意识到,参数beginInsertRows是要求新行的模型索引,而不是新行的实际模型索引.

所以,在这个时间点,Qt让我无法提供QModelIndex与这个特定行相关联的东西.如何为这个新行创建自己的模型索引?

qt qabstractlistmodel qmodelindex

7
推荐指数
1
解决办法
1万
查看次数

如何在QAbstractItemView中获取可见QModelIndex的列表

有没有办法获得当前可见项目的列表QAbstractItemView?并且,如果可能,接收有关更改此列表的任何通知.

UPD:我问的正是有关QAbstractItemViewQTreeView与非普通的结构,而不是QTableView.

Upd2:我正在用复选框实现树视图模型.我想要下一个行为(检查/取消检查相同):

  • 如果选中其中一个复选框 - 则必须检查所有子项
  • 如果选中所有子复选框 - 则也应检查父复选框.父母的父母也一样,等等......

检查状态由外部数据源监视/修改,因此我需要一种机制来更新所有已更改的子项/父项.dataChanged信号对我来说还不够,因为构建一个QModelIndex更新的所有更改列表是非常广泛的.并且根本没有必要,因为将从中挑选所有新数据QAbstractItemModel::data.

我发现下一个脏黑客更新所有项目:emit dataChanged( QModelIndex(), QModelIndex() );但它没有记录无效索引.

所以,我需要一种方法来强制所有可见的项目重新绘制内容和新数据.

model-view-controller qt qmodelindex qabstractitemview

6
推荐指数
2
解决办法
6510
查看次数

将QModelIndex转换为QString

有没有办法将QModelIndex转换为QString?这背后的主要目标是我想使用动态生成的QListView-Items的内容.

QFileSystemModel *foolist = new QFileSystemModel;
    foolist->setRootPath(QDir::rootPath());
    foolistView->setModel(foolist);

[...]

QMessageBox bar;
QString foolist_selectedtext = foolistView->selectionModel()->selectedIndexes();
bar.setText(foolist_selectedtext);
bar.exec;
Run Code Online (Sandbox Code Playgroud)

这甚至是获取当前所选项目的正确方法吗?

提前致谢!

c++ qstring qt qmodelindex

5
推荐指数
1
解决办法
8397
查看次数

我们应该如何在调用beginInsertRows(parent,first,last)时创建父QModelIndex?

这是这个问题的更具体版本。

我想向视图报告我将向我的模型插入一些行。有两种调用方式beginInsertRows

beginInsertRows(QModelIndex(), first, last)
Run Code Online (Sandbox Code Playgroud)

beginInsertRows(createIndex(-1,-1), first, last)
Run Code Online (Sandbox Code Playgroud)

有一个区别:在第二个变体中,QModelIndex将在其内部存储指向我们模型的指针。在 Qml 内部:

void QQuickVisualDataModel::_q_rowsInserted(const QModelIndex &parent, int begin, int end)
{
    Q_D(QQuickVisualDataModel);
    qDebug() << "d->m_adaptorModel.rootIndex = " << d->m_adaptorModel.rootIndex;
    if (parent == d->m_adaptorModel.rootIndex)
        _q_itemsInserted(begin, end - begin + 1);
}
Run Code Online (Sandbox Code Playgroud)

语句主体if不会被执行,因为它似乎rootIndex总是不存储指向模型的指针(即它存储 NULL)

我已经创建了测试 Qt5 应用程序

所以,我的问题是: 这是错误还是功能?有人在我之前尝试过这个错误的调用吗?

qt listview models qml qmodelindex

5
推荐指数
0
解决办法
1584
查看次数

如何完全遍历QStandardItemModel?

我有一个QStandardItemModel,我在q QTreeView中显示.工作良好.

为了突出显示相关的行,我想强调其中的一些:因此我有一个QStringList,其中包含要突出显示的QStandItem*的名称.

QStringList namesToBeHighlighted = getNames();

QModelIndex in = myModel->index(0, 0);

if ( in.isValid() ) {

    for (int curIndex = 0; curIndex < myModel->rowCount(in); ++curIndex) {

        QModelIndex si = myModel->index(curIndex, 0, in);
        QStandardItem *curItem = myModel->itemFromIndex(si);

        if (curItem) {
           QString curItemName = curItem->text();

           if ( namesToBeHighlighted.contains(curItem->text()) ) {
               curItem->setFont(highlightFont);
           }
           else curItem->setFont(unHighlightFont);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的模型有以下结构:
Level_1
+ - > Level_11
+ - > Level_12
+ - > Level_13
Level_2
+ - > Level_21
+ - > Level_22
+ …

c++ qstandarditemmodel qt5 qmodelindex qstandarditem

5
推荐指数
1
解决办法
9055
查看次数

QModelIndexList的析构函数太慢了

执行这个简单的代码片段:

{
  QModelIndexList sel = ui->tableView->selectionModel()->selectedRows(0);
  sel.at(0).isValid(); // To prevent removing the previous line by optimization
}
Run Code Online (Sandbox Code Playgroud)

当所选行的数量约为一百万时,需要超过30秒.QModelIndex列表的构造几乎是立即的,但破坏需要永远.花在这个函数上的时间是:

template <typename T>
Q_INLINE_TEMPLATE void QList<T>::node_destruct(Node *from, Node *to)
{
    if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic)
        while(from != to) --to, delete reinterpret_cast<T*>(to->v);
    else if (QTypeInfo<T>::isComplex)
        while (from != to) --to, reinterpret_cast<T*>(to)->~T();
}
Run Code Online (Sandbox Code Playgroud)

有人有解决方案吗?有没有办法在没有创建的情况下获取所选行的索引QModelIndexList,或者我可以以某种方式加速破坏?

qt qabstractitemmodel qmodelindex

5
推荐指数
1
解决办法
137
查看次数

如何循环QAbstractItemView索引?

我想QAbstractItemView::doubleClicked解开具有特定文本的项目的插槽programaticaly.我想使用QAbstractItemView类来做这个,如果可能的话,不是它的实现.

此任务归结为循环项目和比较字符串.但我找不到能给我所有东西的任何方法QModelIndex.给出任何QModelIndex没有参数的唯一方法是QAbstractItemView::rootIndex.但是,当我查看QModelIndex文档时,我再也看不到访问它的孩子和兄弟姐妹的方法.

那么如何访问所有的QModelIndexes QAbstractItemView

qt qmodelindex qabstractitemview

5
推荐指数
1
解决办法
3640
查看次数

创建QModelIndex

我花了最后一周努力创建一个给定行和列的QModelIndex.

或者,我愿意在已经存在的QModelIndex中更改row()的值.

任何帮助,将不胜感激.

编辑:

QModelIndex nIndex = QAbstractItemModel::createIndex(1, 2);
int b = nIndex.row();
qInfo() << "b" << b;
Run Code Online (Sandbox Code Playgroud)

失败错误:

cannot call member function ‘QModelIndex QAbstractItemModel::createIndex(int, int, void*) const’ without object
         QModelIndex nIndex = QAbstractItemModel::createIndex(1, 2);
                                                                  ^
Run Code Online (Sandbox Code Playgroud)

手头的目标是这样的:

我有一个功能:

void MyClass::doStuff(QModelIndex index)
Run Code Online (Sandbox Code Playgroud)

在该课程中,我基本上做了以下事情:

if (index.column() != 1)
{
    int a=index.row();
}
Run Code Online (Sandbox Code Playgroud)

所以我的目标是从不同的类调用该函数并将其传递给QModelIndex,但是为了使用我指定的行/列创建了该索引.

qt qmodelindex

5
推荐指数
2
解决办法
1万
查看次数