我正试图在特定单元格上进入编辑模式,如下所示:
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()
它似乎不起作用.
我有兴趣计算一个节点的物理位置,QTreeView
但是找不到这样做的方法(除了自己计算它,考虑到鲁棒性,这很麻烦且容易出错QTreeView
).
有没有一种标准方法可以找到与a相关的数据的绘制位置QModelIndex
(类似于将indexAt()
位置映射到a的方式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
与这个特定行相关联的东西.如何为这个新行创建自己的模型索引?
有没有办法获得当前可见项目的列表QAbstractItemView
?并且,如果可能,接收有关更改此列表的任何通知.
UPD:我问的正是有关QAbstractItemView
或QTreeView
与非普通的结构,而不是QTableView
.
Upd2:我正在用复选框实现树视图模型.我想要下一个行为(检查/取消检查相同):
检查状态由外部数据源监视/修改,因此我需要一种机制来更新所有已更改的子项/父项.dataChanged
信号对我来说还不够,因为构建一个QModelIndex
更新的所有更改列表是非常广泛的.并且根本没有必要,因为将从中挑选所有新数据QAbstractItemModel::data
.
我发现下一个脏黑客更新所有项目:emit dataChanged( QModelIndex(), QModelIndex() );
但它没有记录无效索引.
所以,我需要一种方法来强制所有可见的项目重新绘制内容和新数据.
有没有办法将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)
这甚至是获取当前所选项目的正确方法吗?
提前致谢!
这是这个问题的更具体版本。
我想向视图报告我将向我的模型插入一些行。有两种调用方式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 应用程序
所以,我的问题是: 这是错误还是功能?有人在我之前尝试过这个错误的调用吗?
我有一个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
+ …
执行这个简单的代码片段:
{
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
,或者我可以以某种方式加速破坏?
我想QAbstractItemView::doubleClicked
解开具有特定文本的项目的插槽programaticaly.我想使用QAbstractItemView
类来做这个,如果可能的话,不是它的实现.
此任务归结为循环项目和比较字符串.但我找不到能给我所有东西的任何方法QModelIndex
.给出任何QModelIndex
没有参数的唯一方法是QAbstractItemView::rootIndex
.但是,当我查看QModelIndex
文档时,我再也看不到访问它的孩子和兄弟姐妹的方法.
那么如何访问所有的QModelIndex
es QAbstractItemView
?
我花了最后一周努力创建一个给定行和列的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,但是为了使用我指定的行/列创建了该索引.
qmodelindex ×10
qt ×9
c++ ×3
listview ×1
models ×1
qml ×1
qstring ×1
qt5 ×1
qtableview ×1
qtreeview ×1