Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Caduceus от Октябрь 19, 2010, 22:22



Название: QTableView не хочет понимать QAbstractTableModel
Отправлено: Caduceus от Октябрь 19, 2010, 22:22
У меня в процессе работы программы меняется количество строк в QAbstractTableModel
В методе rowCount я возращаю это коичесвто строк

Когда это количество строк меняется - я из модели шлю emit dataChanged

А во View колчиество строк не меняется - их столько сколько в начале. Что я не так делаю?

И еще. Я понимаю, что тема избита и увидел тут же в поиске кучу вариантов ответов, но так и не понял как делать - размеры, эти гребаные размеры строк и столбцов. Где их выставлять? В headerData на Qt::SizeHintRole? В делегатах? где?


Название: Re: QTableView не хочет понимать QAbstractTableModel
Отправлено: BlackTass от Октябрь 19, 2010, 23:11
dataChanged() это изменение данных внутри уже существующих элементов. При добавлении новых строк надо юзать пару beginInsertRow/endInsertRow


Название: Re: QTableView не хочет понимать QAbstractTableModel
Отправлено: Kolobok от Октябрь 19, 2010, 23:16
В описании класса QAbstractTableModel прочитай раздел Subclassing.


Название: Re: QTableView не хочет понимать QAbstractTableModel
Отправлено: CroCIV от Октябрь 20, 2010, 08:51
И еще. Я понимаю, что тема избита и увидел тут же в поиске кучу вариантов ответов, но так и не понял как делать - размеры, эти гребаные размеры строк и столбцов. Где их выставлять? В headerData на Qt::SizeHintRole? В делегатах? где?

Эти гребаные размеры столбцов можно выставить setColumnWidth ( int column, int width ), resizeColumnToContents ( int column ), resizeColumnsToContents () этого гребаного класса QTableView, мать его так. или так же можно получить указатель на "горизонтальный удар по голове" horizontalHeader () и в нем выставить setResizeMode ( int logicalIndex, ResizeMode mode ) setDefaultSectionSize ( int size ) setMinimumSectionSize ( int size ) setStretchLastSection ( bool stretch ) resizeSection ( int logicalIndex, int size )
Относительно строк все тоже самое, только вместо слова Column будет Row, а вместо слова horisontal - vertical. Ассистант в руки http://doc.crossplatform.ru/qt/4.6.x/classes.html (http://doc.crossplatform.ru/qt/4.6.x/classes.html)


Название: Re: QTableView не хочет понимать QAbstractTableModel
Отправлено: Caduceus от Октябрь 20, 2010, 21:35
Спасибо большое. Но!
Если выставить у вида verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); - то есть типа о ресайзится в зависимсоти от контента - но это нифига так не получается - если в модели в headerData убрать ветку if (role == Qt::SizeHintRole) - (где я выставляю сам размеры конкретными чисалми, не зная как узнать размер контента), то нужный мне вертикальный хидер оказывается нулевой ширины.
Если же не убирать ветку if (role == Qt::SizeHintRole), то размеры такие, как я укзаываю в этой ветке не ресайзятся под размеры контента. Как быть-то?


Название: Re: QTableView не хочет понимать QAbstractTableModel
Отправлено: CroCIV от Октябрь 21, 2010, 07:49
Спасибо большое. Но!
Если выставить у вида verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); - то есть типа о ресайзится в зависимсоти от контента - но это нифига так не получается - если в модели в headerData убрать ветку if (role == Qt::SizeHintRole) - (где я выставляю сам размеры конкретными чисалми, не зная как узнать размер контента), то нужный мне вертикальный хидер оказывается нулевой ширины.
Если же не убирать ветку if (role == Qt::SizeHintRole), то размеры такие, как я укзаываю в этой ветке не ресайзятся под размеры контента. Как быть-то?

похоже на баги где-то в твоем собственном коде. Если ты создашь пустой проект, выставишь setResizeMode(QHeaderView::ResizeToContents); начнешь таблицу заполнять своими данными, то увидишь, что все норм работает.
Ты случаем не перекрывал стандартный класс типа QTableView/Widget или QHeaderView? Если нет, то значит ищи ошибки в своем коде, если да, смотри перекрытые методы типа sizeHint и ищи свои ошибки.
Благо (ВЕЛИЧАЙШЕЕ) библиотека открытая, если получаешь неожиданный результат, всегда можно под отладчиком посмотреть, что и как работает.