首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt中的图层管理器

Qt中的图层管理器
EN

Stack Overflow用户
提问于 2012-04-15 16:24:54
回答 1查看 1.2K关注 0票数 2

我想创建一个类似Photoshop的图层选择和可见性的图形用户界面来管理我的软件的图层。基本上,我希望有一个类似于ListView的东西,它的QListWidgetItem具有用于层的文本和用于可见性的复选框。

起初,通过将项的标志设置为UserCheckable,似乎很容易处理QListWidgetQListWidgetItem。它在某种程度上是有效的,但它迫使我选择一个“层”,然后才能改变它的可见性。

有没有什么方法可以实现QListWidgetItem,这样我就可以选中/取消选中该复选框,而不必选中该项目?或者我应该尝试其他东西来实现我的层管理器?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-15 18:45:31

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

您应该派生出自己的QAbstractItemModel,它有两列。第一列是您的checkbox列,您需要分配一个列委托来绘制checkbox项,第二列是您的display text列(下面不会介绍)。然后在YourListView类中:

将点击的信号连接到您自己的插槽:

代码语言:javascript
复制
 connect( this, SIGNAL(clicked( const QModelIndex &  )), this, SLOT(clickedSlot( const QModelIndex &  )) );

并声明/使用

代码语言:javascript
复制
 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解决方案-它有自己的陷阱和角落,这可能会花费你更多的时间让它变成可接受的形状。

祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10160559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档