Доброго времени суток!
Можно ли как то для QTreeView сделать ручную прокрутку (вместо стандратного скрола), c помощью кнопок "Вверх", "Вниз" ?
Да легко:
C++ (Qt)
#include <QApplication>
#include <QTreeView>
#include <QStandardItemModel>
#include <QVBoxLayout>
#include <QPushButton>
#include <QScrollBar>
class TreeView : public QTreeView
{
Q_OBJECT
public:
TreeView( QWidget* p = 0 )
: QTreeView( p )
{}
protected slots:
void scrollUp()
{
QScrollBar* sb = verticalScrollBar();
sb->setValue( sb->value() - 1 );
}
void scrollDown()
{
QScrollBar* sb = verticalScrollBar();
sb->setValue( sb->value() + 1 );
}
};
int main( int argc, char** argv )
{
QApplication app( argc, argv );
QWidget w;
QVBoxLayout l( &w );
QPushButton up( "&Up" ), dn( "&Down" );
up.setAutoRepeat( true ); up.setAutoRepeatInterval( 10 );
dn.setAutoRepeat( true ); dn.setAutoRepeatInterval( 10 );
l.addWidget( &up );
TreeView tv;
l.addWidget( &tv );
tv.setRootIsDecorated( false );
tv.setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
tv.setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
QStandardItemModel model;
tv.setModel( &model );
QStringList colorNames = QColor::colorNames();
model.setColumnCount( 1 );
model.setRowCount( colorNames.size() );
model.setHeaderData( 0, Qt::Horizontal,
"Known Colors", Qt::DisplayRole );
for( int i = 0; i < colorNames.size(); ++i )
{
QModelIndex index( model.index( i, 0, QModelIndex() ) );
model.setData( index, colorNames[i], Qt::DisplayRole );
model.setData( index, QColor( colorNames[i] ), Qt::DecorationRole );
}
l.addWidget( &dn );
tv.connect( &up, SIGNAL( clicked() ), SLOT( scrollUp() ) );
tv.connect( &dn, SIGNAL( clicked() ), SLOT( scrollDown() ) );
w.show();
return app.exec();
}