Qtreeview, изменение размера строки, когда она выбрана - PullRequest
4 голосов
/ 11 октября 2010

Я использую Qt 4.7.0, Qtreeview с несколькими столбцами.

То, что я хочу сделать, это «просто»: я хочу, чтобы линия увеличивала высоту , когда она выбрана.

Достаточно ли будет делегатов для этого?

Я прошел через некоторые вещи с QTableView:

m_pMyTableView->verticalHeader()->setResizeMode(QHeaderView::Interactive);
...
QSize AbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;

Он работает с этим табличным представлением, но я не вижу, как я это сделаю с QTreeview, поскольку для начала у него нет вертикальных заголовков ...

Может кто-нибудь осветить мой путь, пожалуйста?

1 Ответ

1 голос
/ 06 июля 2012

Наряду с установкой uniformRowHeights в вашем QTreeView, вот что я бы попробовал.

Есть несколько способов сделать это, мне нравится использовать сигналы / слоты Qt, поэтому мы собираемся изменить высоту с помощью пользовательского QAbstractItemModel на QTreeView. Эта пользовательская модель будет подключена к сигналу selectionChanged от QItemSelectionModel вашего QTreeView. Пример кода / фрагментов работает с режимом одиночного выбора, но вы можете легко изменить его для обработки нескольких выбранных строк.

Шаг 1 - Создание пользовательской модели со слотом выбора

Создайте пользовательский класс модели, производный от QAbstractItemModel, и убедитесь, что вы создали слот, например:

Q_SLOTS:
    void onSelectionChanged( const QItemSelection&, const QItemSelection& );

Внутри вашего модельного класса добавьте следующие фрагменты / методы.

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 );
    }

    ...
 }

Шаг 2. Подключение изменений выбора к вашей модели

Внутри инициализации вашего 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 непосредственно на QAbstractItemModel, но опять же я предпочитаю использовать сигналы / слоты и сохранять выбор в модели.

Надеюсь, это поможет.

...