Russian Qt Forum

Qt => Model-View (MV) => Тема начата: mozgofil от Июнь 26, 2009, 18:31



Название: Почему для QTableView не работает sizeHint() ?
Отправлено: mozgofil от Июнь 26, 2009, 18:31
Написал код для MCV:
Код
C++ (Qt)
///model.h :
#pragma once
#include <QTCore/QAbstractListModel>
class SelectionGUI;
class CPropTableModel: public QAbstractTableModel
{
public:
CPropTableModel(SelectionGUI* pGUI,const std::list<const IObject*> &selected_objects,QObject *parent=0);
~CPropTableModel();
void OnSelect();
void ClearSelection();
////QAbstractListModel overridables:
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
QVariant data(const QModelIndex &index, int role) const;
};
 
////delegate.h :
#pragma once
#include <QTGui/qitemdelegate.h>
 
class CPropTableDelegate :public QItemDelegate
{
public:
enum PropTableRole{PROP_TABLE_WIDGET=Qt::UserRole+1,PROP_TABLE_FIELD_TYPE};
CPropTableDelegate(QObject *parent=0);
~CPropTableDelegate(void);
 
QWidget* createEditor(QWidget *parent,const QStyleOptionViewItem &,const QModelIndex & ) const;
void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &) const;
void setEditorData(QWidget *editor,const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const;
virtual QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const;
};
 
Когда прицепляю модель и делегат к QTableView  sizeHint() не действует ,
когда прицепляю к QListView  - sizeHint()  действует, но отображается только 1 колонка вместо 2. Что делать?


Название: Re: Почему для QTableView не работает sizeHint() ?
Отправлено: Rcus от Июнь 26, 2009, 18:48
/* Хм, когда это ввели налог на буквы? Похоже скоро соль и спички тоже в дефиците будут, надо запасаться */
/* Осознает свою никчемность в роли телепата, что то все образы размыты: какие-то руки, интересно чьи? видит большие ячейки QTableView и подозревает бессмысленность малого sizeHint'а*/


Название: Re: Почему для QTableView не работает sizeHint() ?
Отправлено: mozgofil от Июнь 26, 2009, 20:08
/* видит большие ячейки QTableView и подозревает бессмысленность малого sizeHint'а*/
o_O
 :o я знаю, вы что-то скрываете

(http://img-fotki.yandex.ru/get/3601/r-g-b-a.0/0_10560_f39e6703_L)
Размер ячеек вообще не зависит от sizeHint'a
создаётся таким образом
Код
C++ (Qt)
//prop table:
m_table_prop_view=new QTableView(parent);
m_table_prop_model=new CPropTableModel(this,selected);
CPropTableDelegate* del=new CPropTableDelegate;
m_table_prop_view->setModel(m_table_prop_model);
m_table_prop_view->setItemDelegate(del);
 


Название: Re: Почему для QTableView не работает sizeHint() ?
Отправлено: BRE от Июнь 26, 2009, 20:12
А ты вызови
void QTableView::resizeRowsToContents ()   [slot]
void QTableView::resizeColumnsToContents ()   [slot]
после установки делегата и думаю все заработает.  ;)


Название: Re: Почему для QTableView не работает sizeHint() ?
Отправлено: mozgofil от Июнь 26, 2009, 20:22
А ты вызови
void QTableView::resizeRowsToContents ()   [slot]
void QTableView::resizeColumnsToContents ()   [slot]
после установки делегата и думаю все заработает.  ;)
Код
C++ (Qt)
//prop table:
m_table_prop_view=new QTableView(parent);
m_table_prop_model=new CPropTableModel(this,selected);
CPropTableDelegate* del=new CPropTableDelegate;
m_table_prop_view->setModel(m_table_prop_model);
m_table_prop_view->setItemDelegate(del);
m_table_prop_view->resizeRowsToContents();
m_table_prop_view->resizeColumnsToContents();
 
Не канает.
По вертикали размер клеток такой же,
по горизонтали -съёжилось



Название: Re: Почему для QTableView не работает sizeHint() ?
Отправлено: BRE от Июнь 26, 2009, 20:29
Не канает.
Вот рабочий пример.

Код
C++ (Qt)
#include <QApplication>
#include <QStandardItemModel>
#include <QTableView>
#include <QItemDelegate>
 
class CItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
virtual QSize sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
return QSize( 63, 63 );
}
};
 
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
 
QStandardItemModel model( 4, 2 );
for( int row = 0; row < 4; ++row )
{
for( int column = 0; column < 2; ++column )
{
QModelIndex index = model.index( row, column, QModelIndex() );
model.setData( index, QVariant( (row+1) * (column+1) ) );
}
}
 
QTableView tableView;
 
CItemDelegate delegate;
tableView.setItemDelegate( &delegate );
 
tableView.setModel( &model );
tableView.resizeColumnsToContents();
tableView.resizeRowsToContents();
 
tableView.show();
 
return app.exec();
}
 
#include "main.moc"
 


Название: Re: Почему для QTableView не работает sizeHint() ?
Отправлено: mozgofil от Июнь 27, 2009, 11:33
Не канает.
Вот рабочий пример.
...
Спасибо, resizeRowsToContents() помогает. :)
Только этого мало для приличного отображения, ещё нужно:
Код
C++ (Qt)
m_table_prop_view->verticalHeader()->hide();
m_table_prop_view->setAlternatingRowColors (true);
m_table_prop_view->horizontalHeader()->setStretchLastSection (true);