Qt中的层管理器
A layer manager in Qt
我想创建一个类似 Photoshop 的 GUI 来选择图层和可见性,以管理我的软件的图层。基本上,我希望有一个类似ListView
的东西,QListWidgetItem
有图层的文本和一个可见性复选框。
设置项目的标志使其可进行用户检查,似乎很容易使用QListWidget
和QListWidgetItem
。它在某种程度上有效,但它迫使我在更改其可见性之前选择一个"图层"。
有没有办法实现QListWidgetItemItem,以便我可以选中/取消选中复选框而无需选择该项目?还是我应该尝试其他方法来实现我的层管理器?
我正在考虑用 QGraphicsView
和 QGraphicsItem
来做到这一点,但我真的很想知道我是否可以在没有的情况下实现它。
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解决方案-它有自己的陷阱和角落,这可能会花费您更多的时间来使其达到可接受的形状。
祝你好运!
- 如何维护资源管理器项目视图中当前可见的项目列表
- 使用"Task"函数指针队列定义作业管理器
- 注销侏儒会话时如何从Qt应用程序执行"confirm" gnome会话管理器的对话框(不使用QSessionManager)
- 如何在不使用透明胶片的情况下创建Qt投影?(因为窗口管理器不支持)
- Qt应用程序中的Windows资源管理器
- Qt中的层管理器
- Qt创建者会话管理器错误
- 在c++中从qt获取Android帐户管理器
- 终止Qt进程:Windows任务管理器在做什么,我没有?
- QT应用程序在Windows资源管理器上不起作用?
- QT启动资源管理器进程参数
- 如何使用Qt在OS文件管理器中添加上下文菜单项
- c++ /Qt:根据Windows资源管理器中当前应用的排序来获取目录中的文件
- Qt -程序仍然在任务管理器中运行时,我关闭窗口期间qApp-> procesevents()
- QT:在选择文件的目录上启动默认的资源管理器
- Qt拖放到windows资源管理器:我如何知道拖放的目标路径
- 从网络访问管理器获得的QT显示图像
- Qt中的智能指针内存管理器
- Qt网络访问管理器JSON获取响应
- Qt下载超过15个文件不工作基于下载管理器的例子