2012-04-15 678 views
2

我想创建一个类似图形用户界面(GUI)的图层用于图层选择和可见性,以管理我的软件图层。基本上,我想有一个像ListView的东西,其中QListWidgetItem具有图层的文本和可见性的复选框。Qt中的图层管理器​​

起初,通过设置项目的标志使其成为UserCheckable,似乎很容易处理QListWidgetQListWidgetItem。它在一定程度上起作用,但它迫使我选择一个“图层”,然后才能改变其可见性。

是否有某种方式来实现QListWidgetItem,以便我可以选中/取消选中复选框而不必选择项目?还是应该尝试其他方法来实现图层管理器​​?

我正在考虑与QGraphicsViewQGraphicsItem这样做,但我真的想知道我是否可以在没有的情况下执行此操作。

回答

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解决方案 - 它有自己的陷阱和角落,这可能会让你有更多的时间将它变成可接受的形状。

祝你好运!

+0

我曾想过使用单独的列,但不能完全决定如何使用它们。现在我有了一个方向。非常感谢你的帮助! – Rikonator 2012-04-15 11:34:10