我有一个继承QTableView的简单类,我想要以下行为:当用户选择几个单元格时,我希望选择第一个单元格作为当前索引。
因此,例如,如果我从(0,0)向(2,2)选择,当我开始输入时,文本将显示在(0,0)中,而不是(2,2),这似乎是默认。
我尝试使用以下内容覆盖setSelection函数:
void SampleTable::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command)
{
if((command & QItemSelectionModel::Current) != 0)
{
QModelIndex curr = indexAt(rect.topLeft());
selectionModel()->select(curr, QItemSelectionModel::Current);
command ^= QItemSelectionModel::Current;
}
QTableView::setSelection(rect, command);
}
但无济于事。它似乎与鼠标事件有关,但我无法在源代码中找到问题,我希望无论如何都有更简单的方法。
答案 0 :(得分:0)
QtableWidget
类有一个信号itemSelectionChanged()
,将其连接到您的自定义广告位。在该插槽中,使用selectedIndexes()
获取所有索引,然后使用setCurrentIndex()
设置您希望成为当前索引的单元格。
答案 1 :(得分:0)
你想要达到什么目的?如果您希望用户仅编辑/选择单个单元格,请使用setSelectionBehaviour强制执行此操作。否则你可以尝试chinfoo的想法,但要确保以用户能够理解它的方式传达行为(即他能够看到他的编辑将改变第一个单元格/行)。
答案 2 :(得分:0)
我弄清楚了问题以及如何修复它,但它并不漂亮。问题出在QAbstractItemView的鼠标移动事件中。经过大量调试和搜索源代码后,我在qabstractitemview.cpp中找到了这个:
void QAbstractItemView::mouseMoveEvent(QMouseEvent *event)
...
if (index.isValid()
&& (index != d->selectionModel->currentIndex())
&& d->isIndexEnabled(index))
d->selectionModel->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
}
我通过为我的类提供一个QModelIndex成员来修复它,该成员存储左上角QModelIndex的最后位置(在上面的setSelection的覆盖版本中设置),然后我用以下方法覆盖mouseMoveEvent:
void SampleTable::mouseMoveEvent(QMouseEvent *event)
{
QTableView::mouseMoveEvent(event);
if (state() == ExpandingState || state() == CollapsingState || state() == DraggingState || state() == EditingState)
return;
if ((event->buttons() & Qt::LeftButton)) {
if (m_topLeft.isValid())
{
selectionModel()->setCurrentIndex(m_topLeft, QItemSelectionModel::NoUpdate);
}
}
}
不是一个漂亮的解决方案,但它确实有效。