QTableView:选择单元格时,如何让第一个单元格选择当前索引?

时间:2011-03-30 07:04:25

标签: c++ qt indexing selection qtableview

我有一个继承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);
}

但无济于事。它似乎与鼠标事件有关,但我无法在源代码中找到问题,我希望无论如何都有更简单的方法。

3 个答案:

答案 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);
        }
    }
}
不是一个漂亮的解决方案,但它确实有效。