QTableView: При выборе ячеек, как сделать первую ячейку выбранной текущий индекс? - PullRequest
0 голосов
/ 30 марта 2011

У меня есть простой класс, который наследует 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 голосов
/ 30 марта 2011

Чего ты пытаешься достичь? Если вы хотите, чтобы пользователь редактировал / выбирал только одну ячейку, используйте setSelectionBehaviour , чтобы форсировать это. В противном случае вы можете попробовать идею Chinfoo, но не забудьте сообщить о поведении таким образом, чтобы пользователь мог понять его (т. Е. Он мог видеть, что его правка изменит первую ячейку / строку).

0 голосов
/ 31 марта 2011

Я разобрался в проблеме и как ее исправить, но это не красиво. Проблема в перемещении мыши для события QAbstractItemView. После долгих отладок и поиска по исходному коду я нашел это в qabstractitemview.cpp:

<code>void QAbstractItemView::mouseMoveEvent(QMouseEvent *event)
...
if (index.isValid()
        && (index != d->selectionModel->currentIndex())
        && d->isIndexEnabled(index))
    <b>d->selectionModel->setCurrentIndex(index, QItemSelectionModel::NoUpdate);</b>
}

Я исправил это, дав моему классу член QModelIndex, в котором хранится последнее местоположение верхнего левого QModelIndex (установленного в моей переопределенной версии setSelection, как описано выше), а затем я переопределил mouseMoveEvent следующим образом:

<code>
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);
        }
    }
}
Не очень хорошее решение, но оно работает.
0 голосов
/ 30 марта 2011

Класс QtableWidget имеет сигнал itemSelectionChanged(), подключите его к своему пользовательскому слоту.В этом слоте используйте selectedIndexes(), чтобы получить все индексы, затем используйте setCurrentIndex(), чтобы установить ячейку, в которой вы хотите быть текущим индексом.

...