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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] conect из цикла for  (Прочитано 7332 раз)
484594182
Гость
« : Август 15, 2017, 00:06 »

есть tableWidget, строки которого заполняются циклом for.
данные берутся из sqlite.
во второй item строки вставляется CheckStateRole.
Код:
for(int i = 0; query.next(); i++){
           // Вставляем строку
           ui->tableWidget->insertRow(i);
           // Устанавливаем в первую колонку id забирая его из результата SQL-запроса
           // Эта колонка будет скрыта
           ui->tableWidget->setItem(i,0, new QTableWidgetItem(query.value(0).toString()));
           // Создаём элемент, который будет выполнять роль чекбокса
           QTableWidgetItem *item = new QTableWidgetItem();
           item->data(Qt::CheckStateRole);
           // Проверяем, на статус 1, если 1, то выставляем состояние чекбокса в Checked, иначе в Unchecked
           if(query.value(1) == 1){ item->setCheckState(Qt::Checked); } else { item->setCheckState(Qt::Unchecked); }
           // Устанавливаем чекбокс во вторую колонку
           ui->tableWidget->setItem(i,1, item);
           // Далее забираем все данные из результата запроса и устанавливаем в остальные поля
           ui->tableWidget->setItem(i,2, new QTableWidgetItem(query.value(2).toString()));
       }
я в qt новенькй... не могу никак раскурить как мне свою функцию повесить обработчиком changeCheckState'а
и где мне писать строку QObject::connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(check(QTableWidgetItem *))  внутри цикла, или еще где-то? и можно ли обойтись без объявления нового класса? я их пока что очень боюсь...
п.с. функция чек собирается проверять стоит галка или нет и слать скуэль либо единицу либо ноль. соответственно функции как то надо передать переменную цикла i и буул переменную статуса галки.
« Последнее редактирование: Август 22, 2017, 11:24 от 484594182 » Записан
484594182
Гость
« Ответ #1 : Август 15, 2017, 00:34 »

ах да...
ubuntu 17.04;
qt creator 4.0.2;
qt 5.7;
gcc 4.9.1
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Август 15, 2017, 06:41 »

Если у тебя отправитель и получатель существуют за пределами цикла, то и соединять их нужно за пределами цикла иначе получишь N штук соединений и соответственно N раз будет вызываться слот на каждую посылку сигнала.

Если бы у тебя в цикле создавались какие-то объекты, которые нужно было бы с чем-то соединить, то соединение нужно было бы производить только внутри цикла, т.к. за пределами цикла их видно не будет.
« Последнее редактирование: Август 15, 2017, 06:44 от lit-uriy » Записан

Юра.
484594182
Гость
« Ответ #3 : Август 15, 2017, 16:48 »

в цикле создается объект, чекстайт, задача в том, чтобы при смене галочки слать sql  запрос и в нем отправлять номер строки.


А разве обработчик можно повесить внутри цикла?

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Август 16, 2017, 05:55 »

в цикле создается объект
Тот конект который ты привёл использует два объекта (отправитель и получатель), которые в цикле не создаются. Если же ты хочешь соединять QTableWidgetItem, то нужно это делать в цикле, т.к. за его пределами этот объект видно не будет (особенность Си/Си++)

А разве обработчик можно повесить внутри цикла?
А речь не идёт об обработчике, речь идёт только о соединении
Записан

Юра.
484594182
Гость
« Ответ #5 : Август 16, 2017, 07:46 »

блин, может подскажете как проще реализовать чтоб при смене чекстайта слать скл запрос?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Август 17, 2017, 06:38 »

484594182, я не знаю устройства твоей программы, поэтому могу только догадки выдвигать.

Перед циклом делаем:
Код
C++ (Qt)
connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(check(QTableWidgetItem *))

Объявляем слот
Код
C++ (Qt)
void check(QTableWidgetItem *item);

пример тела слота:
Код
C++ (Qt)
//делаем проверку на нужный нам столбец
if (item->column() != 1) // НЕ столбец с галкой
   return;
// получаем состояние галки
bool state = item->checkState() == Qt::Checked;
// узнаем ID записи
int row = item->row(); // узнали строку на которой галка находится
QTableWidgetItem *idItem = QTableWidget->item(row, 0); // получили элемент содержащий ID в этой строке
int id = idItem->data().toInt(); получили ID
 
// используем полученные id и state  для создания целевых SQL-запросов
Записан

Юра.
484594182
Гость
« Ответ #7 : Август 17, 2017, 23:08 »

ушёл пробовать...
Записан
484594182
Гость
« Ответ #8 : Август 22, 2017, 07:21 »

никак ... сколько не мучил.. креатор ругается как буд-то нет точки с запятой после строки конекта.. где только не пробовал ее писать. слот в .h файле объявлял. начинает ругаться на не объявленый QTableWidgetItem    Злой

мой заголовочник..

Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
 
#include <QMainWindow>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
 
private slots:
   void on_action_19_triggered();
 
   void on_action_17_triggered();
 
   void check();
 
 
 
private:
   Ui::MainWindow *ui;
   void cleartable();
};
#endif // MAINWINDOW_H
 

с вышеизложеным заголовочным файлом креатор ругается на строку

Код
C++ (Qt)
QObject::connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(check(QTableWidgetItem *));

вот как использовал

Код
C++ (Qt)
// Выполняем заполнение QTableWidget записями с помощью цикла
   for(int i = 0; query.next(); i++){
          // Вставляем строку
          ui->tableWidget->insertRow(i);
          // Устанавливаем в первую колонку id забирая его из результата SQL-запроса
          // Эта колонка будет скрыта
          ui->tableWidget->setItem(i,0, new QTableWidgetItem(query.value(0).toString()));
          // Создаём элемент, который будет выполнять роль чекбокса
          QTableWidgetItem *item = new QTableWidgetItem();
          item->data(Qt::CheckStateRole);
          // Проверяем, на статус 1, если 1, то выставляем состояние чекбокса в Checked, иначе в Unchecked
          if(query.value(1) == 1){ item->setCheckState(Qt::Checked); } else { item->setCheckState(Qt::Unchecked); }
          // Устанавливаем чекбокс во вторую колонку
          ui->tableWidget->setItem(i,1, item);
 
          //QObject::connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(check(QTableWidgetItem *));
 
          // Далее забираем все данные из результата запроса и устанавливаем в остальные поля
          ui->tableWidget->setItem(i,2, new QTableWidgetItem(query.value(2).toString()));
          //ui->tableWidget->setItem(i,3, new QTableWidgetItem(query.value(3).toString()));
          //ui->tableWidget->setItem(i,4, new QTableWidgetItem(query.value(4).toString()));
      }
 
   //connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(check(QTableWidgetItem *));
   //QObject::connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(check(QTableWidgetItem *));
 
 

если раскоментировать один из конектов то компилироваться перестает.

футкция чек

Код
C++ (Qt)
void MainWindow::check()
{
  // if ( item->checkState() == Qt::Checked )
      QMessageBox::warning(this, QString::fromLocal8Bit("privet"), QString::fromLocal8Bit("mir"));
}

пока конект закоментирован всё компилируется и работает как задуманно..
« Последнее редактирование: Август 22, 2017, 07:35 от 484594182 » Записан
484594182
Гость
« Ответ #9 : Август 22, 2017, 07:42 »

что то мне подсказывает что нельзя так делать как я делаю...
потому как три созданых в дизайне чекстайта эта же строка конекта соединяет успешно...

делал так

Код
C++ (Qt)
void MainWindow::on_checkBox_clicked()
{
   MainWindow::check();
}
Записан
484594182
Гость
« Ответ #10 : Август 22, 2017, 07:49 »

в общем пока все на стадии ощибки
Код
C++ (Qt)
mainwindow.cpp:138: ошибка: expected ')' before ';' token
QObject::connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(check());
                                                                                                                                                             ^
в строке
Код
C++ (Qt)
QObject::connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(check());
« Последнее редактирование: Август 22, 2017, 07:51 от 484594182 » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #11 : Август 22, 2017, 08:35 »

Скобку добавьте справа, перед ;
Записан

484594182
Гость
« Ответ #12 : Август 22, 2017, 11:19 »

 о чудо... и правдо я новичок.
откомпилилось.. теперь приконекченая функция вызывается i раз.
i==число строк.
попробую конект вынести за цикл.
Записан
484594182
Гость
« Ответ #13 : Август 22, 2017, 11:23 »

все гуд после того как конект вынес за цикл....
всем большое спасибо, очень помогли Улыбающийся


РЕШЕНО
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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