0

QTableView を継承する単純なクラスがあり、次の動作が必要です。ユーザーがいくつかのセルを選択すると、選択された最初のセルが現在のインデックスとして設定されるようにします。

たとえば、(0, 0) から (2, 2) に向かって選択すると、入力を開始すると、デフォルトのように見える (2, 2) ではなく、(0, 0) にテキストが表示されます。

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 (上記のように setSelection のオーバーライド バージョンで設定) の最後の位置を格納する QModelIndex メンバーをクラスに与えることで修正し、これで 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 に答える