0 / 0 / 0
Регистрация: 03.04.2019
Сообщений: 7
1

Ошибка при соединении сигнала одного класса со слотом другого класса

16.08.2020, 19:40. Показов 1216. Ответов 12
Метки нет (Все метки)

Доброго дня! Подскажите новичку:
В одном классе, названном class Calibration инициализирована кнопка (start_pushButton), при нажатии на которую должен вызываться слот startCalibration(), реализованный в другом классе class MainWindow. Соединение реализую в конструкторе класса Calibration в файле calibration.cpp строкой:
C++ (Qt)
1
connect(ui->start_pushButton, SIGNAL(clicked(bool)), &MainWindow, SLOT(startCalibration()));
Компилятор при этом говорит о наличии синтаксической ошибки в этой строчке: "Expected primary-expression before ',' token".
Как корректно создать соединение?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2020, 19:40
Ответы с готовыми решениями:

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего...

Ошибка при обращении из одного класса к методу другого класса
Структура проекта, 2 класса: класс графики MainWindow класс логики Сannibals при обращении из...

Соединения слота одного класса и сигнала другого
Здравствуйте! Недавно начал изучать Qt и столкнулся с проблемой соединения слотов и сигналов. У...

Ошибка при попытке использовать объект класса в определении другого класса
Муторное название получилось :scratch: Прошу помощи.... есть созданный класс работы со строкой:...

12
фрилансер
4324 / 3774 / 830
Регистрация: 11.10.2019
Сообщений: 10,116
16.08.2020, 20:11 2
Сергей Ремезов, а так?
C++ (Qt)
1
connect(ui->start_pushButton, &QPushButton::clicked, &MainWindow, &MyMainWindowClass::startCalibration);
MyMainWindowClass - подставь свой класс
0
0 / 0 / 0
Регистрация: 03.04.2019
Сообщений: 7
16.08.2020, 20:39  [ТС] 3
C++ (Qt)
1
connect(ui->start_pushButton, &QPushButton::clicked, &MainWindow, &MainWindow::startCalibration);
Таже самая ошибка.

(Нужно ли для обеспечения соединения, в классе Calibration создать экземпляр класса MainWindow?)
0
фрилансер
4324 / 3774 / 830
Регистрация: 11.10.2019
Сообщений: 10,116
16.08.2020, 21:29 4
Сергей Ремезов, так я не понял, MainWindow - это объект или имя класса ?

я полагаю так

MyMainWindowClass MainWindow;
0
0 / 0 / 0
Регистрация: 03.04.2019
Сообщений: 7
16.08.2020, 23:09  [ТС] 5
Содержимое файлов, чтоб было понятней:
mainwindow.h:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class Calibration;
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
public slots:
   void startCalibration();
 
private:
    Ui::MainWindow *ui;
    Calibration *m_calibration = nullptr;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "calibration.h"
 
MainWindow::MainWindow(QWidget *parent):
     QMainWindow(parent),
     ui(new Ui::MainWindow),
     m_calibration(new Calibration)
{
    ui->setupUi(this);
    //Окно Calibration вызывается из menubar основного окна
    connect(ui->actionCalibration, &QAction::triggered, m_calibration, &Calibration::show);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::startCalibration()
{
    qDebug() << "MW-> startCalibration";
}
calibration.h:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef CALIBRATION_H
#define CALIBRATION_H
#include <QMainWindow>
#include "mainwindow.h"
 
namespace Ui {
class Calibration;
}
 
class Calibration : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit Calibration(QWidget *parent = nullptr);
    ~Calibration();
 
private:
    Ui::Calibration *ui = nullptr;
};
 
#endif // CALIBRATION_H
calibration.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "calibration.h"
#include "ui_calibration.h"
 
Calibration::Calibration(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Calibration)
{
    ui->setupUi(this);
    //--------------------------------------Здесь ошибка:
    //connect(ui->start_pushButton, &QPushButton::clicked, &MainWindow, &MainWindow::startCalibration);
 
    connect(ui->start_pushButton, SIGNAL(clicked(bool)), &MainWindow, SLOT(startCalibration()));
}
 
Calibration::~Calibration()
{
    delete ui;
}
0
2427 / 1169 / 433
Регистрация: 08.11.2016
Сообщений: 3,242
17.08.2020, 07:18 6
Сергей Ремезов, коннект осуществляется между экземплярами классов, на момент вызова QObject::connect соединяемые объекты должны существовать, указатели на эти объекты передаются методу connect первым и третьим параметрами соответственно источник и приемник.
0
фрилансер
4324 / 3774 / 830
Регистрация: 11.10.2019
Сообщений: 10,116
17.08.2020, 07:36 7
Сергей Ремезов,

C++ (Qt)
1
connect(ui->start_pushButton, SIGNAL(clicked(bool)), this, SLOT(startCalibration()));
0
2 / 1 / 1
Регистрация: 31.08.2018
Сообщений: 4
17.08.2020, 12:14 8
Нужно создать объект класса MainWindow
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "calibration.h"
#include "ui_calibration.h"
 
Calibration::Calibration(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Calibration)
{
    ui->setupUi(this);
 
    MainWindow mw;
    connect(ui->start_pushButton, SIGNAL(clicked()), &mw, SLOT(startCalibration()));
}
 
Calibration::~Calibration()
{
    delete ui;
}
https://doc.qt.io/qt-5/signalsandslots.html
Тут можете почитать документацию с разными примерами которые можно применять
0
0 / 0 / 0
Регистрация: 03.04.2019
Сообщений: 7
17.08.2020, 16:15  [ТС] 9
Всем спасибо ответившим. Только столкнулся с такой проблемой: Когда в файле calibration.cpp создаю экземпляр класса:
C++ (Qt)
1
2
MainWindow mw;
connect(ui->start_pushButton, SIGNAL(clicked()), &mw, SLOT(startCalibration()));
компилятор собирает проект без ошибок, однако при запуске приложения оно аварийно завершается. Может это связано с тем, что у меня в проекте окно с классом Calibration вызывается из контекстного меню окна с классом MainWindow?
0
Эксперт .NET
5448 / 4222 / 1207
Регистрация: 12.10.2013
Сообщений: 12,213
Записей в блоге: 2
17.08.2020, 17:53 10
Цитата Сообщение от Сергей Ремезов Посмотреть сообщение
Может это связано с тем, что у меня в проекте окно с классом Calibration вызывается из контекстного меню окна с классом MainWindow?
Думаю, это связано с тем, что вы намешали все в кучу, не разобравшись как следует как это все работает. Вы можете своими словами, без кода рассказать, что и как у вас в приложении должно работать, как взаимодействовать и так далее?
0
2 / 1 / 1
Регистрация: 31.08.2018
Сообщений: 4
17.08.2020, 18:51 11
Цитата Сообщение от insite2012 Посмотреть сообщение
компилятор собирает проект без ошибок, однако при запуске приложения оно аварийно завершается. Может это связано с тем, что у меня в проекте окно с классом Calibration вызывается из контекстного меню окна с классом MainWindow
Запустите дебагер и он все покажет где падает
0
0 / 0 / 0
Регистрация: 03.04.2019
Сообщений: 7
17.08.2020, 19:17  [ТС] 12
Есть основное окно приложения (class MainWindow), у него есть menubar, при нажатии на него вызывается второе окно (class Calibration), которое содержит кнопку. Необходимо, чтобы при нажатии на эту кнопку вызывался слот основного окна (реализованный в MainWindow). Пример кода вверху.
0
Эксперт .NET
5448 / 4222 / 1207
Регистрация: 12.10.2013
Сообщений: 12,213
Записей в блоге: 2
17.08.2020, 20:03 13
Лучший ответ Сообщение было отмечено Сергей Ремезов как решение

Решение

Цитата Сообщение от Сергей Ремезов Посмотреть сообщение
Необходимо, чтобы при нажатии на эту кнопку вызывался слот основного окна (реализованный в MainWindow).
Всего-навсего? См. прикрепленный архив.
Вложения
Тип файла: zip test_001.zip (5.2 Кб, 2 просмотров)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2020, 20:03
Помогаю со студенческими работами здесь

Ошибка при вызове метода класса в методе другого класса
Господа программисты, возникла такая проблема. При вызове метода класса в методе другого класса...

Ошибка при работе с объектом класса в конструкторе другого класса
Имеется данный код: https://github.com/ubelian/glgame/tree/master/glgame В файле Food.cpp в...

С помощью делегата из одного класса вызвать private метод с другого класса
доброго времени суток. такой вопрос. С применением делегатов и пониманием проблем нет когда...

Перегрузка операции + с преобразованием объектов одного класса в объекты другого класса
Доброго времени суток! Изучаю ООП, при выполнении следующего задания возникли сложности: Создать...

Передача значения переменной из метода одного класса в метод другого класса
Добрый вечер! Есть основная форма Form1 в которой есть метод private void button1_Click(object...

Из одного класса обратиться к свойству progressBar из другого класса (основного окна)
Привет! :) Помогите пожалуйста нубу (мне). У меня есть два класса. Первый (основной), его код:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru