QListWidget使用itemAt()来确定点击项目边界矩形并选择它 - 即使它只有复选框。由于这种方法不是虚拟的,你不能在没有任何肮脏的技巧的情况下改变这种行为(每次选择复选框时改变选择等)。你将不得不派生你自己的QListView和QAbstractItemModel(就像QListWidget一样)。别担心,others注意到了一些不方便的检查/选择行为。让我给你一些指导:
你应该派生你自己的QAbstractItemModel有两列。第一列是您的复选框列,您需要指定一个列表复选框项目的列代表,第二列是您的显示文本列(不在下面)。然后,在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的模型 - 视图 - 委托架构是有点吓人未经训练的程序员,但一旦了解它的乐趣。啊,我个人不会使用手工编织的QGraphicsView解决方案 - 它有自己的陷阱和角落,这可能会让你有更多的时间将它变成可接受的形状。
祝你好运!
我曾想过使用单独的列,但不能完全决定如何使用它们。现在我有了一个方向。非常感谢你的帮助! – Rikonator 2012-04-15 11:34:10