Russian Qt Forum

Qt => Вопросы новичков => Тема начата: psicho666 от Май 04, 2017, 11:06



Название: Как передать параметр из функции в ходе ее выполнения в главное окно
Отправлено: psicho666 от Май 04, 2017, 11:06
Добрый день.

Подскажите, пожалуйста, как реализовать вот что:

У меня есть функция С, внутри которой в процессе выполнения меняется параметр:

int Parameter = 0;

void F(void)
{
  for (int i = 0; i < 10; i++)
  {
    // что-то делается
    Parametr++;
  }
}

Эта функция вызывается по событию из главного окна программы.
Я хочу передать этот параметр в главное окно, чтобы там, например,
передвигался бегунок во время выполнения цикла в функции.
Сама функция ничего не знает об окне программы, которая ее вызывает.

Можно ли это как-то реализовать?
Спасибо!


Название: Re: Как передать параметр из функции в ходе ее выполнения в главное окно
Отправлено: TheGringerEye от Май 04, 2017, 11:14
Ну вот для этого в Qt и существует система сигналов и слотов, у ползунка есть слот на изменение значения, вы должны создать в вашем классе сигнал с таким же параметром, соединить сигнал со слотом и из вашей функции передавать в сигнал нужное вам значение.


Название: Re: Как передать параметр из функции в ходе ее выполнения в главное окно
Отправлено: psicho666 от Май 04, 2017, 11:38
Спасибо!

А как реализовать сигнал?
Вот что я сделал: добавил сигнал changeParameter в главную форму:

class MainWindow : public QMainWindow
{
  Q_OBJECT

public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();

signals:
    void changeParameter(unsigned int Parameter);

private:
  Ui::MainWindow *ui;


private slots:
// всякое разное
  void on_progressBar_valueChanged(int value);
};

Добавил слот для бегунка:

void MainWindow::on_progressBar_valueChanged(int value)
{
  // двигаю бегунок и все такое
}

Соединяю сигнал со слотом в конструкторе главного окна:

connect(ui->progressBar, SIGNAL(changeParameter(unsigned int)), this, SLOT(on_progressBar_valueChanged(int)));

Правильно ли это?
И как потом сделать, чтобы внешняя функция на С, определенная в другом файле,
посылала сигнал главному окну?

Спасибо еще раз!


Название: Re: Как передать параметр из функции в ходе ее выполнения в главное окно
Отправлено: TheGringerEye от Май 04, 2017, 11:42
Сигнал не имеет реализации, её пишет сама метаобъектная система Qt`а, ну вроде бы правильно, теперь вам надо в функции эмитить ваш сигнал
int Parameter = 0;

void F(void)
{
  for (int i = 0; i < 10; i++)
  {
    // что-то делается
    emit changeParameter(++Parametr);

  }
}


Название: Re: Как передать параметр из функции в ходе ее выполнения в главное окно
Отправлено: psicho666 от Май 04, 2017, 12:00
Сдалал, не работает... Компилятор говорит, что не определен тип emit.

Файл, в котором определена функция F, написанная на С, включен в проект.
Он примерно такой:

#include <stdlib.h>
#include <math.h>
#include "nrutil.h"

extern int Parameter;

void F(void)
{
  for (int i = 0; i < 10; i++)
  {
    // что-то делается
    emit changeParameter(++Parametr);
  }
}

Как научить эту функцию эмитировать сигнал, определенный в главной форме, т.е. в классе MainWindow : public QMainWindow?


Название: Re: Как передать параметр из функции в ходе ее выполнения в главное окно
Отправлено: Пантер от Май 04, 2017, 12:06
> Как научить эту функцию эмитировать сигнал, определенный в главной форме, т.е. в классе MainWindow : public QMainWindow

Никак. Ты можешь у экземпляра объекта MainWindow дернуть метод, который заэммитит сигнал.


Название: Re: Как передать параметр из функции в ходе ее выполнения в главное окно
Отправлено: psicho666 от Май 04, 2017, 12:20
Экземпляр обьекта главного окна появляется в main:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  MainWindow w;

  w.show();

  return a.exec();
}

Т.е. я должен каким-то образом передать указатель на w в функцию F и
в ней вызвать сигнал?
Просто не допру никак, как это сделать...


Название: Re: Как передать параметр из функции в ходе ее выполнения в главное окно
Отправлено: Пантер от Май 04, 2017, 12:29
Код
C++ (Qt)
class Emmiter : public QObject
{
   Q_OBJECT
 
public:
   void setValue (int value) {
        emit changed (value);
   }
 
Q_SIGNALS:
   void changed (int value);
}
 
............
void foo (Emmiter *emmiter) {
.........
emmiter->setValue(++Parametr);
.......
 

Создаешь в главном окне объект Emmiter, его передаешь в функцию и коннектишься на сигнал.


Название: Re: Как передать параметр из функции в ходе ее выполнения в главное окно
Отправлено: psicho666 от Май 04, 2017, 21:14
С сигналами/слотами пока не разобрался.

Сделал вот как: в конструкторе главного окна обьявил

public slots:
  void onStatusChanged(unsigned int status);

и ниже функцию

static void updateStatus(unsigned int status, void *pointer)
{
  MainWindow *w = (MainWindow*)pointer;
  w->onStatusChanged(status);
}

Указатель на эту функцию передаю как дополнительный параметр в С функцию F:

extern void F( ... параметры... void(*callback)(unsigned int, void *), void *pointer);

в которой уже вызывается callback.
Работает...