QListWidget 使用itemAt()来确定一个被点击的项目边界矩形并选择它——即使它只是一个复选框。由于此方法不是虚拟的,因此您无法在没有任何肮脏技巧的情况下更改该行为(每次切换复选框时更改选择等)。您必须派生自己的 QListView 和 QAbstractItemModel (就像 QListWidget 一样)。别担心,其他人注意到一些不方便的检查/选择行为。让我给你一些方向:
您应该派生自己的 QAbstractItemModel,它有两列。第一列是您的复选框列,您需要分配一个绘制复选框项目的列委托,第二列是您的显示文本列(下面未介绍)。然后在 YourListView 类中:
将 clicked 信号连接到您自己的插槽:
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 的模型-视图-委托架构对于未经培训的程序员来说有些可怕,但一旦了解它的乐趣。啊,我个人会避免使用手工编织的 QGraphicsView 解决方案——它有自己的陷阱和角落,这可能会花费你更多的时间来让它变成可接受的形状。
祝你好运!