我正在使用Qt 4.7.0,一个包含多个列的Qtreeview。
我想做的是“简单”:我想要一条线来增加高度,当它被选中时。
代表们是否足够这样做?
我使用QTableView进行了一些操作:
m_pMyTableView->verticalHeader()->setResizeMode(QHeaderView::Interactive);
...
QSize AbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
它正在使用这个tableview,但我无法看到我将如何在QTreeview上执行此操作,因为,首先,它没有任何垂直标题...
有人可以点赞我的道路吗?
答案 0 :(得分:1)
除了在uniformRowHeights
中设置QTreeView
,我还会尝试。
有几种方法可以做到这一点,我喜欢使用Qt的信号/插槽,因此我们将通过QAbstractItemModel
上的自定义QTreeView
更改高度。此自定义模型将与selectionChanged
的{{1}}信号QItemSelectionModel
相关联。示例代码/代码段使用单选模式,但您可以轻松更改它以处理多个选定的行。
步骤1 - 使用选择槽创建自定义模型
创建派生自QTreeView
的自定义模型类,并确保创建一个插槽,例如:
QAbstractItemModel
在模型类中添加以下代码段/方法。
Q_SLOTS:
void onSelectionChanged( const QItemSelection&, const QItemSelection& );
第2步 - 将选择更改连接到您的模型
在初始化void MyModelClass::onSelectionChanged( const QItemSelection& selected,
const QItemSelection& deselected )
{
if( !selected.empty() )
{
// Save the index within the class.
m_selectedIndex = selected.first();
Q_EMIT dataChanged( m_selectedIndex, m_selectedIndex );
}
}
QVariant MyModelClass::data( const QModelIndex& index, int role ) const
{
// Use the selected index received from the selection model.
if( m_selectedIndex.isValid() &&
index == m_selectedIndex &&
role == Qt::SizeHintRole )
{
// Return our custom size!
return QSize( 50, 50 );
}
...
}
内部创建自定义模型并执行以下操作:
QTreeView
我确信有几种方法可以做到这一点,即将MyTreeView::MyTreeView( QWidget* parent ) : QWidget( parent )
{
...
MyModelClass* model = new MyModelClass();
setModel( model );
setSelectionMode( QAbstractItemView::SingleSelection );
setSelectionBehavior( QAbstractItemView::SelectRows );
connect
(
selectionModel(),
SIGNAL( selectionChanged(const QItemSelection&, const QItemSelection&) ),
model,
SLOT( onSelectionChanged(const QItemSelection&, const QItemSelection&) )
);
}
直接交给你的QItemSelectionModel
,但我再次使用信号/插槽并将选择保存在模型中。
希望这有帮助。