Russian Qt Forum

Qt => Вопросы новичков => Тема начата: 484594182 от Август 15, 2017, 00:06



Название: [РЕШЕНО] conect из цикла for
Отправлено: 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 и буул переменную статуса галки.


Название: Re: conect из цикла for
Отправлено: 484594182 от Август 15, 2017, 00:34
ах да...
ubuntu 17.04;
qt creator 4.0.2;
qt 5.7;
gcc 4.9.1


Название: Re: conect из цикла for
Отправлено: lit-uriy от Август 15, 2017, 06:41
Если у тебя отправитель и получатель существуют за пределами цикла, то и соединять их нужно за пределами цикла иначе получишь N штук соединений и соответственно N раз будет вызываться слот на каждую посылку сигнала.

Если бы у тебя в цикле создавались какие-то объекты, которые нужно было бы с чем-то соединить, то соединение нужно было бы производить только внутри цикла, т.к. за пределами цикла их видно не будет.


Название: Re: conect из цикла for
Отправлено: 484594182 от Август 15, 2017, 16:48
в цикле создается объект, чекстайт, задача в том, чтобы при смене галочки слать sql  запрос и в нем отправлять номер строки.


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



Название: Re: conect из цикла for
Отправлено: lit-uriy от Август 16, 2017, 05:55
в цикле создается объект
Тот конект который ты привёл использует два объекта (отправитель и получатель), которые в цикле не создаются. Если же ты хочешь соединять QTableWidgetItem, то нужно это делать в цикле, т.к. за его пределами этот объект видно не будет (особенность Си/Си++)

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


Название: Re: conect из цикла for
Отправлено: 484594182 от Август 16, 2017, 07:46
блин, может подскажете как проще реализовать чтоб при смене чекстайта слать скл запрос?


Название: Re: conect из цикла for
Отправлено: lit-uriy от Август 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-запросов


Название: Re: conect из цикла for
Отправлено: 484594182 от Август 17, 2017, 23:08
ушёл пробовать...


Название: Re: conect из цикла for
Отправлено: 484594182 от Август 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"));
}

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


Название: Re: conect из цикла for
Отправлено: 484594182 от Август 22, 2017, 07:42
что то мне подсказывает что нельзя так делать как я делаю...
потому как три созданых в дизайне чекстайта эта же строка конекта соединяет успешно...

делал так

Код
C++ (Qt)
void MainWindow::on_checkBox_clicked()
{
   MainWindow::check();
}


Название: Re: conect из цикла for
Отправлено: 484594182 от Август 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());


Название: Re: conect из цикла for
Отправлено: gil9red от Август 22, 2017, 08:35
Скобку добавьте справа, перед ;


Название: Re: conect из цикла for
Отправлено: 484594182 от Август 22, 2017, 11:19
 о чудо... и правдо я новичок.
откомпилилось.. теперь приконекченая функция вызывается i раз.
i==число строк.
попробую конект вынести за цикл.


Название: Re: conect из цикла for
Отправлено: 484594182 от Август 22, 2017, 11:23
все гуд после того как конект вынес за цикл....
всем большое спасибо, очень помогли :)


РЕШЕНО