0

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

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

4

3 回答 3

0

该类QtableWidget有一个信号itemSelectionChanged(),将其连接到您的自定义插槽。在该插槽中,用于selectedIndexes()获取所有索引,然后用于setCurrentIndex()设置要成为当前索引的单元格。

于 2011-03-30T09:47:14.460 回答
0

你想达到什么目的?如果您希望用户仅编辑/选择单个单元格,请使用setSelectionBehaviour强制执行此操作。否则,您可以尝试 chinfoo 的想法,但确保以用户能够理解的方式传达行为(即他能够看到他的编辑将更改第一个单元格/行)。

于 2011-03-30T09:54:03.347 回答
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);
        }
    }
}
不是一个很好的解决方案,但它有效。

于 2011-03-31T04:35:37.353 回答