Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: patison от Июнь 02, 2010, 00:45



Название: QTableWidget. Слишком громоздко как-то получается...
Отправлено: patison от Июнь 02, 2010, 00:45
Имеется на форме QTableWidget, с двумя колонками.
После некоторых вычислений, этот QTableWidget заполняется в цикле инфой.

Пока что реализовал следующим образом:
Код:
    
int i=0;
    foreach( FileInfoStruct item, stack ) {

        QTableWidgetItem *twItem1 = new QTableWidgetItem;
        QTableWidgetItem *twItem2 = new QTableWidgetItem;

        twItem1->setText( item.sFileName );
        twItem1->setFlags( Qt::ItemIsEnabled );
        ui->tableWidget->setItem(i, 0, twItem1);

        twItem2->setText( item.sFileAbsPath );
        twItem2->setFlags( Qt::ItemIsEnabled );
        ui->tableWidget->setItem(i, 1, twItem2);

        i++;
    }
Насколько правилен такой подход? Уж очень мне не нравится выделять такое кол-во памяти, да и + таким способом, в цикле. Тем более что нигде эта память в итоге не удаляется.
Подскажите, Как быть? Такой подход нормален? Или есть другие методики?

Спасибо.


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: ритт от Июнь 02, 2010, 03:31
нормален, но далеко не оптимален.
советую написать простенькую табличную модель и использовать в паре с QTableView


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: patison от Июнь 02, 2010, 10:17
В том-то и дело что с QTableView я промучался какое-то время, но так и не понял каким образом создать модель.. Все примеры что я нашёл - использовали QSqlTableViewModel или что-то в этом роде. А я с Sql вообще не работаю...
Не могли-бы вы мне показать простенький пример, подходящий для моего случая?


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: ритт от Июнь 02, 2010, 18:36
QStringListModel - пример проще некуда


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: patison от Июнь 02, 2010, 20:38
Я имел ввиду пример кода :)
QStringListModel я уже смотрел. Но так и не догнал, каким образом формировать отображение.
Вот например мне нужна одна колонка в tableView. Делаю так:
Код:
    
QStringListModel qm;
qm.setHeaderData(0, Qt::Horizontal, "AAA");
ui->tableView->setModel(&qm);

Однако ничего не выходит.


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: MoPDoBoPoT от Июнь 03, 2010, 00:04
Делаю так:
Код:
    
QStringListModel qm;
qm.setHeaderData(0, Qt::Horizontal, "AAA");
ui->tableView->setModel(&qm);

Однако ничего не выходит.
Типичная ошибка новичка. Модель создается на стеке в каком-то методе (скорей всего конструкторе) объекта -> при выходе из метода, все объекты, созданные на стеке, разрушаются. Создавай объект в куче:
Код
C++ (Qt)
 
QStringListModel *qm = new QStringListModel(this);
qm->setHeaderData(0, Qt::Horizontal, "AAA");
ui->tableView->setModel(qm);
 


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: patison от Июнь 03, 2010, 00:44
Блин, действительно не подумал об этом. В Qt я новичек, но в С++ не совсем :)) Совсем упустил из виду что это локальная переменная у меня.

А подскажите ещё, как теперь в созданной моделе задать имя колонки (в данный момен там просто цифра "1"), и + как добавить инфу в TableView.

Спасибо.


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: Kolobok от Июнь 03, 2010, 01:15
QAbstractItemModel::setHeaderData ( int section, Qt::Orientation orientation, const QVariant & value, int role = Qt::EditRole )


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: patison от Июнь 03, 2010, 01:21
Kolobok: ну я воспользовался кодом, предоставленным чуть выше:
Код:
...
qm->setHeaderData(0, Qt::Horizontal, "AAA");
...
По идее в заголовке должен быть столбец "ААА", но вместо этого там столбец "1".


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: Kolobok от Июнь 03, 2010, 01:37
Функционал этого метода тебе придется реализовывать самому.


Название: Re: QTableWidget. Слишком громоздко как-то получается...
Отправлено: MoPDoBoPoT от Июнь 03, 2010, 01:41
Вообще, отображение Q*ListModel подразумевается в QListView, который не имеет заголовки. Если хочешь иметь необходимый тебе заголовок, то реализуй соответствующий функционал.