Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Изменение высоты и ширины ячеек.

Автор: 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 символа.

Автор: Litkevich Yuriy 14.3.2009, 19:04

Цитата(Antrix @ 14.3.2009, 21:38) *
Оба варианта слишком медлительны. Как можно ускорить этот процес?
скорее всего это связано с перерисовкой, попробуй обернуть большие изменения в
http://doc.crossplatform.ru/qt/4.4.3/qwidget.html#updatesEnabled-prop

Автор: BRE 14.3.2009, 19:05

Цитата(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

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

Вот исходник.

 temp.zip ( 3.3 килобайт ) : 89
 

Автор: BRE 14.3.2009, 21:19

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

Поглядим.

Автор: Stanislaus 14.3.2009, 21:59

Нужно переопределить класс модели, которую ты используешь в QTableView. А именно, переопределить метод http://www.doc.crossplatform.ru/qt/4.3.2/qabstractitemmodel.html#data, для роли Qt::SizeHint. Так же можно попробовать воспользоваться setData(), но не думаю, что этот вариан будет очень быстрым.
После популяции view, нужно выполнить view->resizeRowsToContents() и view->resizeColumnsToContents(), чтобы был учтен size hint.
Где-то тут в статьях был очень хороший мануал, как эффективно использовать Model/View фреймворк. Не могу найти, к сожалению.

Автор: BRE 14.3.2009, 22:18

Цитата(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

BRE спасибо за пример :clapping: . Но все-равно очень долго получается изминение размеров ячеек.
По всей видимости, единственый путь, делать так.
QTableView* t = new QTableView();
t->horizontalHeader()->setDefaultSectionSize(34);
t->verticalHeader()->setDefaultSectionSize(17);
Работает многновенно.

Автор: anonymous 15.3.2009, 15:26

Околотемный вопрос, скажите а можно ли сделать так чтобы в ячейке QTableWidget можно было помещать многострочный текст??
Или чтобы он хотя бы отображался таковым??

Автор: BRE 15.3.2009, 15:40

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

Делегаты наше Фсе! Переопределяй paint и рисуй хоть по диагонале. :)

Автор: Litkevich Yuriy 15.3.2009, 16:30

Цитата(Гость_anonymous_* @ 15.3.2009, 18:26) *
можно было помещать многострочный текст??
Или чтобы он хотя бы отображался таковым??
я делал так:
QString str = "first line\nsecond line";
и получал двестрочки.

Автор: anonymous 15.3.2009, 20:14

Цитата(Litkevich Yuriy @ 15.3.2009, 16:30) *
QString str = "first line\nsecond line";
и получал двестрочки.


Скажите, а есть ли какой-нибудь параметр чтобы ячейки сами расширялись показываю что в них написано, без задания конкретных значений ширины???
Интересует именно расширение вниз по ширине.

Автор: Litkevich Yuriy 15.3.2009, 20:23

см. слоты у http://www.doc.crossplatform.ru/qt/4.4.3/qtableview.html там четыре штуки, два для строк, два для столбцов

Автор: Кристина 4.2.2010, 15:28

Цитата(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
к примеру так
virtual QSize sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const
    {
        return QSize( 63, 63 );
    }

Автор: Litkevich Yuriy 4.2.2010, 17:59

По моему Antrix, уже решил проблему. почти год назад

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)