QTableView
の助けだけでなく、領域自体QHeaderView
で直接列幅を変更するための動作が必要です。エリア内のセル間にカーソルポインターを設定し、エリア自体の「クリックアンドドラッグ」で列幅を変更QTableView
できるとよいでしょう。QTableView
QTableView
3 に答える
列区切り記号にアクセスする方法を示す部分的な回答
/** 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からの提案も機能します(計算効率の議論は無関係ですが)が、一般的には、代替のより一般的なアプローチを試すことができると思います。つまり、HorizontalHeaderアイテムを代理ハンドラとして使用するためです。そこには、必要なすべての機能するロジックがすでにあります。
これらの GUI の詳細を試してみたい (そして学びたい) 場合は、マウスの垂直位置をシフトして、イベントをヘッダーに与えてみてください。うまくいくと思います。自分で状態を追跡するよりも簡単です。
実際、私はそのような行動に問題があるとは思いません。特に、本当に便利な読み取り専用のテーブル ビューの場合。
これを実装して、マウス イベントをキャッチし、サイズ変更コマンドを発行するイベント ハンドラーをインストールする最速の方法。明らかに、マウスが列セパレーターの上/周りにある場合は、手動で計算する必要があります。
UPD:カーソルが垂直軸の周りにあるかどうかを知るには、次の方法を使用できます。
/* Returns the x-coordinate in contents coordinates of the given column. */
int x = tableView->columnViewportPosition(int column);
マウスイベントはマウスの位置を示し、それが列軸のいずれかに一致するかどうかを簡単に確認できます。
UPD2: 1 つの eventHandler 内でヘッダーのサイズ変更/スクロール イベントと一緒に mousemove を処理するために、もう少し複雑な方法で実装することもできます...並べ替えられたリストの列の位置をキャッシュし、mousemove ハンドラーで費やされる時間を最適化します..だから、あなたはバイナリ検索と距離チェックを取得します..しかし、それはもちろん、一般的なインターフェイスの重さに依存します..