Russian Qt Forum

Qt => Общие вопросы => Тема начата: AntonUfo от Январь 24, 2010, 21:15



Название: Вопрос по работе с QTableWidget
Отправлено: AntonUfo от Январь 24, 2010, 21:15
Несколько дней бьюсь, не могу создать простейшую таблицу из n столбцов и m строк, количество столбцов заранее известно, количество строк переменно (начинается с одной), строки нужно как добавлять новые (при нажатии кнопки создается новая строка и заполняется случайными числами к примеру) так и удалять нужные (ввел число, нашел его в таблице, удалил строчку к примеру). В примерах которые нашел в книгах, таблицы создаются на этапе компилирования целиком, может кто нибудь делал "для себя" небольшой примерчик по работе с таблицами.. ? (Тяжело у меня понимается модель - представление, поэтому и разобраться не могу....)


Название: Re: Вопрос по работе с QTableWidget
Отправлено: DS_tm от Январь 25, 2010, 01:18
Для того, чтобы изменить (добавить/удалить) количество строк в таблице используйте функция setRowCount(). Чтобы задать значение для конкретной ячейки ислользуйте setItem().


Название: Re: Вопрос по работе с QTableWidget
Отправлено: DS_tm от Январь 25, 2010, 01:20
А вообще для более-менее сложных таблиц лучше использовать связку QAbstractTableModel и QTableView.


Название: Re: Вопрос по работе с QTableWidget
Отправлено: AntonUfo от Январь 25, 2010, 12:57
а как организовать выбор ячейки как в массивах (i,j) или [j], т.е. предположим нашел я нужную строчку, теперь нужно удалить все ячейки ее составляющие... т.е. нужно перебрать item(row,column) а как это сделать ?


Название: Re: Вопрос по работе с QTableWidget
Отправлено: DS_tm от Январь 25, 2010, 13:03
tableWidget->model()->index(int row, int column)


Название: Re: Вопрос по работе с QTableWidget
Отправлено: AntonUfo от Январь 25, 2010, 13:30
дело вот в чем, у меня создан собственный класс MyTable, наследник QTableWidget, для MyTable определены методы

void  MyTable::tableSetParam(параметры);
void  MyTable::tableAddStr(параметры);
void  MyTable::tableDellStr(параметры);

соответственно создаю таблицу так:
table new MyTable(0);

если нужно добавить строчку то в нужном месте программы вызываю
table -> tableAddStr(параметры);

к примеру удаление строки таблицы выглядит так:

Код:
void MyTable::tableDalStr(параметры){
QString str = параметры->number;
QList<QTableWidgetItem *> found = findItems(str, Qt::MatchWildcard);
foreach (item, found){
 int row = item->row(); //нашли нужный номер строки
 removeRow(row); //удалили строчку
}

Код:
добавление строки....

void MyTable::tableAddStr(параметры){
QVector <QString> str(5)

str[0]  = параметры->number;
str[1] = параметры->цвет;
str[n] = ......................

int myrow = rowCount();
serRowCount(myrow+1);

 for (int i = 0; i <n; i++){
   item = new QTableWidgetItem;
   item -> setText(str[i]);
   setItem(myrow,i,item);

}
}

как то похоже нужно организовать ввод параметров  (используется уже при изменении созданных строк таблицы, т.е. item ы ячеек уже созданы, к ним нужно обеспечить доступ и изминять....)






Название: Re: Вопрос по работе с QTableWidget
Отправлено: DS_tm от Январь 25, 2010, 19:58
По делу: для доступа к существующим айтемам используйте QTableWidget::item(int row, int column). Потом с помощью setText или setData меняем айтом.

ОФФТОП касательно кода:
Цитировать
Код:
void MyTable::tableDalStr(параметры){
QString str = параметры->number;
Шикарно! ;D

Код
C++ (Qt)
foreach (item, found){
int row = item->row();
removeRow(row);
}
 
меняем на:
Код
C++ (Qt)
foreach(QTableWidget *item, found) removeRow(item->row());
 

P.S А вообще, как я уже говорил, для таких целей лучше использовать QTableView и свою модель наследовать от QAbstractTableModel! Изменение данных на стороне модели уж как-то по логичнее смотрятся.


Название: Re: Вопрос по работе с QTableWidget
Отправлено: SABROG от Январь 25, 2010, 22:12
Казалось бы хорошая штука foreach(), а вот менять в этом цикле элемент контейнера нельзя, т.к. ссылка константная. Бывает обидно, когда элемент контейнера - твой класс и ты не можешь вызвать не константный метод. И снова здравствуйте for(), while() и индексы с итераторами.


Название: Re: Вопрос по работе с QTableWidget
Отправлено: DS_tm от Январь 25, 2010, 22:40
Казалось бы хорошая штука foreach(), а вот менять в этом цикле элемент контейнера нельзя, т.к. ссылка константная. Бывает обидно, когда элемент контейнера - твой класс и ты не можешь вызвать не константный метод. И снова здравствуйте for(), while() и индексы с итераторами.

Полностью согласен с вышесказанным, только не очень понятно к чему это?)


Название: Re: Вопрос по работе с QTableWidget
Отправлено: SABROG от Январь 25, 2010, 22:56
Полностью согласен с вышесказанным, только не очень понятно к чему это?)

Да обидно стало немного за Qt, вон boost может менять:

Код
C++ (Qt)
short array_short[] = { 1, 2, 3 };
BOOST_FOREACH( short & i, array_short )
{
   ++i;
}
// array_short contains {2,3,4} here