crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Изменение высоты и ширины ячеек., QTableView
Antrix
  опции профиля:
сообщение 14.3.2009, 18:38
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 25.9.2008
Пользователь №: 300

Спасибо сказали: 4 раз(а)




Репутация:   0  


Есть табличка с 2 столбцами и 64к строк. Нужно задать высоту ячеек, например, на 17, ширину на 34.
Пробывал делать так:
QTableView* t = new QTableView();
t->resizeColumnsToContents();
//или так:
for (int i = 0; i < N; i++) //N = 64000
t->horizontalHeader()->resizeSection(i, 17);
Оба варианта слишком медлительны. Как можно ускорить этот процес? Текс во всех ячейках одинаковой длины - 4 символа.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.3.2009, 19:04
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Antrix @ 14.3.2009, 21:38) *
Оба варианта слишком медлительны. Как можно ускорить этот процес?
скорее всего это связано с перерисовкой, попробуй обернуть большие изменения в
setUpdatesEnabled(...)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 14.3.2009, 19:05
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Antrix @ 14.3.2009, 18:38) *
Есть табличка с 2 столбцами и 64к строк. Нужно задать высоту ячеек, например, на 17, ширину на 34.
Пробывал делать так:
QTableView* t = new QTableView();
t->resizeColumnsToContents();
//или так:
for (int i = 0; i < N; i++) //N = 64000
t->horizontalHeader()->resizeSection(i, 17);
Оба варианта слишком медлительны. Как можно ускорить этот процес? Текс во всех ячейках одинаковой длины - 4 символа.

Сделай и установи своего делегата, у которого переопредели sizeHint.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Antrix
  опции профиля:
сообщение 14.3.2009, 21:18
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 25.9.2008
Пользователь №: 300

Спасибо сказали: 4 раз(а)




Репутация:   0  


setUpdatesEnabled(...) - непомогло.
Решил проблемму так:
QTableView* t = new QTableView();
t->horizontalHeader()->setDefaultSectionSize(34);
t->verticalHeader()->setDefaultSectionSize(17);
Пробыл сделать как предложил BRE. Не получилось. Переопределил sizeHint, но этот метод даже не вызывается. Нашел решение это й же проблеммы, но все равно не работает.
Вот описание решения: http://lists.trolltech.com/qt-interest/200...ead01062-0.html
Пробую пример не пашет.
Что я делаю не так? Уж очень хочется найти ответ :rolleyes:

Вот исходник.
Прикрепленные файлы
Прикрепленный файл  temp.zip ( 3,3 килобайт ) Кол-во скачиваний: 187
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 14.3.2009, 21:19
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Antrix @ 14.3.2009, 21:14) *
Что я делаю не так? Уж очень хочется найти ответ :rolleyes:

Поглядим.

Сообщение отредактировал BRE - 14.3.2009, 21:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Stanislaus
  опции профиля:
сообщение 14.3.2009, 21:59
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 23.4.2008
Пользователь №: 156

Спасибо сказали: 0 раз(а)




Репутация:   0  


Нужно переопределить класс модели, которую ты используешь в QTableView. А именно, переопределить метод QAbstractItemModel::data(), для роли Qt::SizeHint. Так же можно попробовать воспользоваться setData(), но не думаю, что этот вариан будет очень быстрым.
После популяции view, нужно выполнить view->resizeRowsToContents() и view->resizeColumnsToContents(), чтобы был учтен size hint.
Где-то тут в статьях был очень хороший мануал, как эффективно использовать Model/View фреймворк. Не могу найти, к сожалению.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 14.3.2009, 22:18
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(BRE @ 14.3.2009, 21:19) *
Поглядим.


main.cpp

#include <QApplication>
#include <QStandardItemModel>
#include <QTableView>
#include <QHeaderView>
#include "CItemDelegate.h"

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 );
        tableView.setItemDelegate( &delegate );

        tableView.setModel( &model );
        tableView.resizeColumnsToContents();
        tableView.resizeRowsToContents();

        tableView.show();

        return app.exec();
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Antrix
  опции профиля:
сообщение 15.3.2009, 14:57
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 25.9.2008
Пользователь №: 300

Спасибо сказали: 4 раз(а)




Репутация:   0  


BRE спасибо за пример :clapping: . Но все-равно очень долго получается изминение размеров ячеек.
По всей видимости, единственый путь, делать так.
QTableView* t = new QTableView();
t->horizontalHeader()->setDefaultSectionSize(34);
t->verticalHeader()->setDefaultSectionSize(17);
Работает многновенно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_anonymous_*
сообщение 15.3.2009, 15:26
Сообщение #9





Гости








    


Околотемный вопрос, скажите а можно ли сделать так чтобы в ячейке QTableWidget можно было помещать многострочный текст??
Или чтобы он хотя бы отображался таковым??
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 15.3.2009, 15:40
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(anonymous @ 15.3.2009, 15:26) *
Околотемный вопрос, скажите а можно ли сделать так чтобы в ячейке QTableWidget можно было помещать многострочный текст??
Или чтобы он хотя бы отображался таковым??

Делегаты наше Фсе! Переопределяй paint и рисуй хоть по диагонале. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 3.12.2024, 9:35