Название: Как передать параметр из функции в ходе ее выполнения в главное окно Отправлено: 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 Код
Создаешь в главном окне объект 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. Работает... |