Russian Qt Forum

Qt => Вопросы новичков => Тема начата: wildcat от Февраль 10, 2012, 10:51



Название: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 10:51
Имеется QTableWidget, каким способом можно получить данные ячеек в строке и перенаправить их в lineEdit'ы?

Вот имеется такая штука как QTableWidget::selectedItems (), которая возвращает список всех выделенных элементов...
До меня не доходит, как можно изъять значение каждой выделенной ячейки в строке и передать их дальше.
Дайте пожалуйста наводку))


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: _OLEGator_ от Февраль 10, 2012, 10:59
%QTDIR%\bin\assistant.exe


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: alexman от Февраль 10, 2012, 10:59
А ты QTableWidgetItem смотрел?


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 11:18
Да я им пользовался, когда получал данные из запроса sqlite.

вот получение данных конкретной ячейки знаю как... а как именно выделенной строки
Код
C++ (Qt)
QTableWidgetItem * QTableWidget::item ( int row, int column ) const
tableWidget->item(0,2)->text()


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 11:43
получилось что то вроде этого ))) :
Код
C++ (Qt)
void usbController::s_buttonUpdate()
{
  //qDebug() << tableWidget->selectedItems();
 
  QTableWidgetItem *item = new QTableWidgetItem();
  int i= tableWidget->selectionModel()->selectedRows().count(); //строка
  qDebug() << i;
  int j=0; //столбец
  QString text;
  while (j<6)
  {
      text=tableWidget->item(i,j)->text();
      j++;
      qDebug() << QString("Items in list: ") << text;
  }
 
}


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: kambala от Февраль 10, 2012, 13:28
проще уж QTableWidget::selectedItems(). или QTableWidget::selectedRanges() если можно выделять группами.

P.S. зачем у тебя в коде присутствует строчка QTableWidgetItem *item = new QTableWidgetItem(); - непонятно.


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 13:50
вот выделяю строку и получаю ее значение:

Код
C++ (Qt)
int i= tableWidget->selectionModel()->selectedRows().count();

Почему то ее значение всегда больше 0-ля. Хотя выделяю первую строку, а выдает 1-цу...


А это строчка QTableWidgetItem *item = new QTableWidgetItem(); - ошибся, удалил.


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: mutineer от Февраль 10, 2012, 13:53
может потому, что count() - это количество выделенных строк?


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 14:04
дошло))) вот что получилось:
Код
C++ (Qt)
int usbController::s_buttonUpdate()
{
 
  int i= tableWidget->currentRow(); //строка
  if (tableWidget->selectedItems().isEmpty ())
  {
       return true;
  }
  qDebug() << i; //QTableWidget
  int j=0; //столбец
  QString tx;
  while (j<6)
  {
      tx=tableWidget->item(i,j)->text();
 
      if (j==0) lineEdit_5->setText(tx);
      if (j==1) lineEdit_3->setText(tx);
      if (j==3) lineEdit_1->setText(tx);
      if (j==4) lineEdit_4->setText(tx);
      if (j==5) lineEdit_3->setText(tx);
      if (j==6) lineEdit_2->setText(tx);
 
      j++;
      qDebug() << QString("Items in list: ") << tx;
 
  }
 
   return true;
}


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: mutineer от Февраль 10, 2012, 14:06
А про цикл for слышать не приходилось? Он бы тут был более к месту

Да и switch тоже удобный оператор...

Кстати, if (j==6) не выполнится


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 14:16
Код
C++ (Qt)
if (j==6) lineEdit_2->setText(tx);
- убрал. - он и не нужным был.

Про цикл for, слышал и пользовался... только не пойму чем здесь плох while ()?

switch - а как переключатель тут можно применить?

Сейчас вроде все норм работает... Только в самой таблицы имеется косяк...
Применил сортировку столбцов:
Код
C++ (Qt)
tableWidget->horizontalHeader()->moveSection(int ,int)

Таблица выводится при клике на кнопку. При первом клике все  норм, при втором клике таблица меняет расположении столбцов...


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: mutineer от Февраль 10, 2012, 14:26
for(int j = 0; j < 6; ++j) - читается лучше, чем while в этом случае

вместо череды if-ов switch(j) {...} тоже чисто для улучшения читабельности кода


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: Пантер от Февраль 10, 2012, 14:27
for(int j = 0; j < 6; ++j) - читается лучше, чем while в этом случае

вместо череды if-ов switch(j) {...} тоже чисто для улучшения читабельности кода
А еще лучше, сложить lineEdit_* в контейнер.


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: mutineer от Февраль 10, 2012, 14:29
for(int j = 0; j < 6; ++j) - читается лучше, чем while в этом случае

вместо череды if-ов switch(j) {...} тоже чисто для улучшения читабельности кода
А еще лучше, сложить lineEdit_* в контейнер.

Ну это вообще в идеале:)


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 14:33
С контейнерами еще не работал... только начал учиться... когда то прогал на с++, но очень простые программы и очень давно.


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 14:42
Следуя Ваши советам ))

Код
C++ (Qt)
int usbController::s_buttonUpdate()
{
 
  int i= tableWidget->currentRow(); //строка
  if (tableWidget->selectedItems().isEmpty ())
  {
       return true;
  }
  qDebug() << i; //QTableWidget
 
  QString tx;
 
  for (int j=0; j<6; ++j)
  {
      tx=tableWidget->item(i,j)->text();
 
      switch (j) {
 
        case 0 :
           lineEdit_5->setText(tx); // группа
        case 1 :
           lineEdit_3->setText(tx);// контекст
        case 3 :
            lineEdit_1->setText(tx); // имя_носиетля
        case 4 :
            lineEdit_4->setText(tx); // имя владельца
        case 5 :
            lineEdit_2->setText(tx); // iSerial
 
      qDebug() << QString("Items in list: ") << tx;
            break;
               }
  }
   return true;
}


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: mutineer от Февраль 10, 2012, 14:46
забыл в switch'е поставить break...


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: Пантер от Февраль 10, 2012, 14:47
Код
C++ (Qt)
QMap <int, QLineEdit*> edits;
edits [0] = lineEdit_5;
edits [1] = lineEdit_3;
edits [3] = lineEdit_1;
edits [4] = lineEdit_4;
edits [5] = lineEdit_2;
 
 
for (int j=0; j<6; ++j) {
 if (edits.contains (j)) {
   const QString text = tableWidget->item(i,j)->text();
   edits [j]->setText (text);
 }
}
 


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: BRE от Февраль 10, 2012, 14:52
Пантер, почему не просто QList? :)
Код
C++ (Qt)
QMap <int, QLineEdit*> edits;
edits [0] = lineEdit_5;
...
 


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 14:56
Потрясающие возможности оптимизации кода. Спасибо Вам огромное.

Код
C++ (Qt)
int usbController::s_buttonUpdate()
{
 
  int i= tableWidget->currentRow(); //строка
  if (tableWidget->selectedItems().isEmpty ())
  {
       return true;
  }
 
  QMap <int, QLineEdit*> edits;
  edits [0] = lineEdit_5;
  edits [1] = lineEdit_3;
  edits [3] = lineEdit_1;
  edits [4] = lineEdit_4;
  edits [5] = lineEdit_2;
 
 
  for (int j=0; j<6; ++j) {
    if (edits.contains (j)) {
      const QString text = tableWidget->item(i,j)->text();
      edits [j]->setText (text);
    }
  }
   return true;
}


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: Пантер от Февраль 10, 2012, 14:59
BRE, обрати внимание на отсутствие индекса 2.
wildcat, контейнер лучше сделай мембером класса и заполни его в конструкторе.


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: sudo от Февраль 10, 2012, 15:02
И метод, в принципе, вполне может быть без возвращаемого значения. Типы возвращаемых значений реальные и в сигнатуре не совпадают, хотя true и кастанётся в единицу. Компилятор предупреждения не выдаёт?


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: BRE от Февраль 10, 2012, 15:06
BRE, обрати внимание на отсутствие индекса 2.
Так 0, туда положить по этому индексу и проверку вместо contains. :)


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: Пантер от Февраль 10, 2012, 15:07
BRE, обрати внимание на отсутствие индекса 2.
Так 0, туда положить по этому индексу и проверку вместо contains. :)

Можно и так. :) Мне показалось с мапом проще для понимания.


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: sudo от Февраль 10, 2012, 15:09
wildcat, а не собираешься ли ты через эти lineEditы редактировать значения в TableView? А то может сейчас тебе нормальную модель сообразим, прям в ячейках можно будет редактировать


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 15:13
И метод, в принципе, вполне может быть без возвращаемого значения. Типы возвращаемых значений реальные и в сигнатуре не совпадают, хотя true и кастанётся в единицу. Компилятор предупреждения не выдаёт?

Не выдает.

Да вот вижу что нет индекса 2. Вот есть мысль как исправить... реализовать пытаюсь))) Дело в том что вот это значение это по сути номер столбца... После сортировки столбцов в TableWidget визуально столбцы поменялись местами, а индексы их остались. Вот пытаюсь визуальные переделать в фактические и тогда контейнер будет нормальным )))


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: wildcat от Февраль 10, 2012, 15:17
wildcat, а не собираешься ли ты через эти lineEditы редактировать значения в TableView? А то может сейчас тебе нормальную модель сообразим, прям в ячейках можно будет редактировать

Да я думал что бы сделать редактор в ячейках... но не получится... Механизм очень сложный... Дело в том. что есть программа по регистрации usb носителей... Каждый носитель заносится в БД. Первый столбец в БД является контрольной суммой всех аргументов (владелец, серия, группа, название устройства)... По этому проще вызывать процесс и вставлять в него аргументы из LineEdit. А то придется реализовывать весь процесс подсчета контрольной суммы.


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: BRE от Февраль 10, 2012, 15:25
Можно и так. :) Мне показалось с мапом проще для понимания.
Для пониманию возможно, а по хорошему и QList там не нужен. :)
Код
C++ (Qt)
QLineEdit *edits[] = { lineEdit_5, lineEdit_3, 0, lineEdit_4, lineEdit_1 };
 


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: Пантер от Февраль 10, 2012, 15:36
BRE, тогде еще и static const. ;D


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: BRE от Февраль 10, 2012, 15:43
BRE, тогде еще и static const. ;D
При static массив будет инициализирован единожды, а если при очередном вызове указатели на объекты QLineEdit изменяться?
А при const компилятор нам не даст вызвать не const-методы (а setText как раз такой).
 :)


Название: Re: QTableWidget - получение данных из выделенной строки
Отправлено: Пантер от Февраль 10, 2012, 15:47
Код
C++ (Qt)
static QLineEdit *const edits [] = {lineEdit_5, lineEdit_3, 0, lineEdit_4, lineEdit_1};
 
На счет статика, да, если меняются, то не стоит.