Qt中的层管理器

A layer manager in Qt

本文关键字:管理器 Qt      更新时间:2023-10-16

我想创建一个类似 Photoshop 的 GUI 来选择图层和可见性,以管理我的软件的图层。基本上,我希望有一个类似ListView的东西,QListWidgetItem有图层的文本和一个可见性复选框。

起初,通过

设置项目的标志使其可进行用户检查,似乎很容易使用QListWidgetQListWidgetItem。它在某种程度上有效,但它迫使我在更改其可见性之前选择一个"图层"。

有没有办法实现QListWidgetItemItem,以便我可以选中/取消选中复选框而无需选择该项目?还是我应该尝试其他方法来实现我的层管理器?

我正在考虑用 QGraphicsViewQGraphicsItem 来做到这一点,但我真的很想知道我是否可以在没有的情况下实现它。

QListWidget 使用 itemAt( ) 来确定单击的项目边界矩形并选择它 - 即使它只是复选框。由于此方法不是虚拟的,因此您无法在没有任何肮脏技巧的情况下更改该行为(每次切换复选框时更改选择等)。你必须派生自己的QListView和QAbstractItemModel(就像QListWidget一样)。别担心,其他人注意到了一些不方便的检查/选择行为。让我给你一些方向:

您应该派生自己的 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解决方案-它有自己的陷阱和角落,这可能会花费您更多的时间来使其达到可接受的形状。

祝你好运!