3

QTableViewの助けだけでなく、領域自体QHeaderViewで直接列幅を変更するための動作が必要です。エリア内のセル間にカーソルポインターを設定し、エリア自体の「クリックアンドドラッグ」で列幅を変更QTableViewできるとよいでしょう。QTableViewQTableView

4

3 に答える 3

1

列区切り記号にアクセスする方法を示す部分的な回答

/** sense mouse position */
bool FreezeTableWidget::eventFilter(QObject *, QEvent *event) {
    if (event->type() == QEvent::MouseMove) {
        QMouseEvent *m = static_cast<QMouseEvent*>(event);
        QPoint p = m->pos();
        QRect r = visualRect(indexAt(p));
        if (abs(p.x() - r.x()) < 3) // || abs(p.x() - r.right()) < 3)
            setCursor(Qt::SplitHCursor);
        else
            unsetCursor();
    }
    return false;
}

eventFilter は仮想関数ですが、呼び出すには登録する必要があります。FreezeTableWidget コンストラクターに追加しました。

qApp->installEventFilter(this);

編集:位置チェックについては、evilruffからの提案も機能します(計算効率の議論は無関係ですが)が、一般的には、代替のより一般的なアプローチを試すことができると思います。つまり、Horizo​​ntalHeaderアイテムを代理ハンドラとして使用するためです。そこには、必要なすべての機能するロジックがすでにあります。

これらの GUI の詳細を試してみたい (そして学びたい) 場合は、マウスの垂直位置をシフトして、イベントをヘッダーに与えてみてください。うまくいくと思います。自分で状態を追跡するよりも簡単です。

于 2013-08-09T20:57:13.137 に答える
1

実際、私はそのような行動に問題があるとは思いません。特に、本当に便利な読み取り専用のテーブル ビューの場合。

これを実装して、マウス イベントをキャッチし、サイズ変更コマンドを発行するイベント ハンドラーをインストールする最速の方法。明らかに、マウスが列セパレーターの上/周りにある場合は、手動で計算する必要があります。

UPD:カーソルが垂直軸の周りにあるかどうかを知るには、次の方法を使用できます。

/* Returns the x-coordinate in contents coordinates of the given column. */
int x = tableView->columnViewportPosition(int column); 

マウスイベントはマウスの位置を示し、それが列軸のいずれかに一致するかどうかを簡単に確認できます。

UPD2: 1 つの eventHandler 内でヘッダーのサイズ変更/スクロール イベントと一緒に mousemove を処理するために、もう少し複雑な方法で実装することもできます...並べ替えられたリストの列の位置をキャッシュし、mousemove ハンドラーで費やされる時間を最適化します..だから、あなたはバイナリ検索と距離チェックを取得します..しかし、それはもちろん、一般的なインターフェイスの重さに依存します..

于 2013-08-09T15:00:07.700 に答える