Russian Qt Forum
Ноябрь 24, 2024, 13:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему для QTableView не работает sizeHint() ?  (Прочитано 7727 раз)
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. Что делать?
Записан
Rcus
Гость
« Ответ #1 : Июнь 26, 2009, 18:48 »

/* Хм, когда это ввели налог на буквы? Похоже скоро соль и спички тоже в дефиците будут, надо запасаться */
/* Осознает свою никчемность в роли телепата, что то все образы размыты: какие-то руки, интересно чьи? видит большие ячейки QTableView и подозревает бессмысленность малого sizeHint'а*/
Записан
mozgofil
Гость
« Ответ #2 : Июнь 26, 2009, 20:08 »

/* видит большие ячейки QTableView и подозревает бессмысленность малого sizeHint'а*/
o_O
 Шокированный я знаю, вы что-то скрываете


Размер ячеек вообще не зависит от 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);
 
Записан
BRE
Гость
« Ответ #3 : Июнь 26, 2009, 20:12 »

А ты вызови
void QTableView::resizeRowsToContents ()   [slot]
void QTableView::resizeColumnsToContents ()   [slot]
после установки делегата и думаю все заработает.  Подмигивающий
Записан
mozgofil
Гость
« Ответ #4 : Июнь 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();
 
Не канает.
По вертикали размер клеток такой же,
по горизонтали -съёжилось

Записан
BRE
Гость
« Ответ #5 : Июнь 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"
 
Записан
mozgofil
Гость
« Ответ #6 : Июнь 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);
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.145 секунд. Запросов: 21.