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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как передать параметр из функции в ходе ее выполнения в главное окно  (Прочитано 5039 раз)
psicho666
Гость
« : Май 04, 2017, 11:06 »

Добрый день.

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

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

int Parameter = 0;

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

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

Можно ли это как-то реализовать?
Спасибо!
Записан
TheGringerEye
Гость
« Ответ #1 : Май 04, 2017, 11:14 »

Ну вот для этого в Qt и существует система сигналов и слотов, у ползунка есть слот на изменение значения, вы должны создать в вашем классе сигнал с таким же параметром, соединить сигнал со слотом и из вашей функции передавать в сигнал нужное вам значение.
Записан
psicho666
Гость
« Ответ #2 : Май 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)));

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

Спасибо еще раз!
Записан
TheGringerEye
Гость
« Ответ #3 : Май 04, 2017, 11:42 »

Сигнал не имеет реализации, её пишет сама метаобъектная система Qt`а, ну вроде бы правильно, теперь вам надо в функции эмитить ваш сигнал
int Parameter = 0;

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

  }
}
Записан
psicho666
Гость
« Ответ #4 : Май 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?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Май 04, 2017, 12:06 »

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

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
psicho666
Гость
« Ответ #6 : Май 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 и
в ней вызвать сигнал?
Просто не допру никак, как это сделать...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Май 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, его передаешь в функцию и коннектишься на сигнал.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
psicho666
Гость
« Ответ #8 : Май 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.
Работает...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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