Russian Qt Forum
Ноябрь 26, 2024, 23:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по работе с QTableWidget  (Прочитано 8980 раз)
AntonUfo
Гость
« : Январь 24, 2010, 21:15 »

Несколько дней бьюсь, не могу создать простейшую таблицу из n столбцов и m строк, количество столбцов заранее известно, количество строк переменно (начинается с одной), строки нужно как добавлять новые (при нажатии кнопки создается новая строка и заполняется случайными числами к примеру) так и удалять нужные (ввел число, нашел его в таблице, удалил строчку к примеру). В примерах которые нашел в книгах, таблицы создаются на этапе компилирования целиком, может кто нибудь делал "для себя" небольшой примерчик по работе с таблицами.. ? (Тяжело у меня понимается модель - представление, поэтому и разобраться не могу....)
Записан
DS_tm
Гость
« Ответ #1 : Январь 25, 2010, 01:18 »

Для того, чтобы изменить (добавить/удалить) количество строк в таблице используйте функция setRowCount(). Чтобы задать значение для конкретной ячейки ислользуйте setItem().
Записан
DS_tm
Гость
« Ответ #2 : Январь 25, 2010, 01:20 »

А вообще для более-менее сложных таблиц лучше использовать связку QAbstractTableModel и QTableView.
Записан
AntonUfo
Гость
« Ответ #3 : Январь 25, 2010, 12:57 »

а как организовать выбор ячейки как в массивах (i,j) или [j], т.е. предположим нашел я нужную строчку, теперь нужно удалить все ячейки ее составляющие... т.е. нужно перебрать item(row,column) а как это сделать ?
Записан
DS_tm
Гость
« Ответ #4 : Январь 25, 2010, 13:03 »

tableWidget->model()->index(int row, int column)
« Последнее редактирование: Январь 25, 2010, 13:05 от DS_tm » Записан
AntonUfo
Гость
« Ответ #5 : Январь 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 ы ячеек уже созданы, к ним нужно обеспечить доступ и изминять....)




Записан
DS_tm
Гость
« Ответ #6 : Январь 25, 2010, 19:58 »

По делу: для доступа к существующим айтемам используйте QTableWidget::item(int row, int column). Потом с помощью setText или setData меняем айтом.

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

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

P.S А вообще, как я уже говорил, для таких целей лучше использовать QTableView и свою модель наследовать от QAbstractTableModel! Изменение данных на стороне модели уж как-то по логичнее смотрятся.
Записан
SABROG
Гость
« Ответ #7 : Январь 25, 2010, 22:12 »

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

Казалось бы хорошая штука foreach(), а вот менять в этом цикле элемент контейнера нельзя, т.к. ссылка константная. Бывает обидно, когда элемент контейнера - твой класс и ты не можешь вызвать не константный метод. И снова здравствуйте for(), while() и индексы с итераторами.

Полностью согласен с вышесказанным, только не очень понятно к чему это?)
Записан
SABROG
Гость
« Ответ #9 : Январь 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
 
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.101 секунд. Запросов: 21.