QListWidget はitemAt( )を使用して、クリックされた項目の境界を示す四角形を決定し、それを選択します (チェックボックスのみの場合でも)。このメソッドは仮想ではないため、汚いトリック (チェック ボックスが切り替えられるたびに選択を変更するなど) なしではその動作を変更することはできません。独自の QListView と QAbstractItemModel を派生させる必要があります (QListWidget のように)。心配しないでください。他の人は、不都合なチェック/選択動作に気付きました。方向性を教えてください:
2 つの列を持つ独自の QAbstractItemModel を派生させる必要があります。最初の列はチェックボックス列で、チェックボックス項目を描画する列デリゲートを割り当てる必要があります。2 番目は表示テキスト列です (以下では説明しません)。次に、YourListView クラスで:
クリックされた信号を自分のスロットに接続します。
connect( this, SIGNAL(clicked( const QModelIndex & )), this, SLOT(clickedSlot( const QModelIndex & )) );
と宣言/使用
void YourListView::clickedSlot( const QModelIndex &index )
{
if( index.isValid() )
{
// Checkbox toggle
if( index.column() == 0 )
{
QVariant beforeValue = this->model()->data( index );
this->model()->setData( index, QVariant::fromValue( ! beforeValue.toBool() ) );
}
else
if( index.column() == 1 )
{
this->selectionModel()->select( index, QItemSelectionModel::Toggle );
}
}
}
Qt の model-view-delegate アーキテクチャは、訓練を受けていないプログラマにとってはやや怖いものですが、一度その楽しさを理解しました。ああ、個人的には手織りの QGraphicsView ソリューションの使用を控えたいと思います。独自のトラップやコーナーがあり、許容できる形にするのにより多くの時間がかかる可能性があります。
幸運を!