我想创建一个类似于Photoshop的图层用于图层选择和可视性来管理我的软件图层。基本上,我想要ListView
之类的内容,QListWidgetItem
包含图层文本和可见性复选框。
首先,通过设置项目的标志使其成为UserCheckable,使用QListWidget
和QListWidgetItem
似乎很容易。它在某种程度上起作用,但它迫使我选择一个'层?在我改变其知名度之前。
有没有办法实现QListWidgetItem,以便我可以检查/取消选中复选框而无需选择项目?或者我应该尝试其他方法来实现我的图层管理器?
我正在考虑使用QGraphicsView
和QGraphicsItem
,但我真的想知道我是否可以在没有这个的情况下实现这一点。
答案 0 :(得分:1)
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解决方案 - 它有自己的陷阱和角落,这可能会花费你更多的时间让它变成可接受的形状。
祝你好运!