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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не срабатывает слот  (Прочитано 4083 раз)
Zusykss
Гость
« : Июль 14, 2017, 09:29 »

Первый класс, там есть объект MainWindow
Код:
#include <QObject>
#include <memory>
#include "def.h"
#include "filemanager.h"
#include "mainwindow.h"

class Presenter : public QObject
{
    Q_OBJECT
public:
    explicit Presenter(QObject *parent = nullptr);
    ~Presenter();
signals:
    void Start();
public slots:
    void StartWork();
    void StartChecking(const QPair<QString, QString>&, QList<CheckInfo>&);
private:
    MainWindow * window;
    std::unique_ptr<FileManager> m_file;
};

// После создания объекта, по клику срабатывает signal Ready(), но слот не работатет
Код:
Presenter::Presenter(QObject *parent) : QObject(parent)
{
    window = new MainWindow;
    QObject::connect(window, &MainWindow::Ready, this, &Presenter::Start);
    QObject::connect(this, &Presenter::Start, this, &Presenter::StartWork);
    window->show();

}

Presenter::~Presenter()
{

}

void Presenter::StartWork()
{
    QList<QPair<QString, QString>> m_userInfo; // Логины и пароли
    QList<CheckInfo> m_listInfo; // Запись парсинга
    m_file.reset(new FileManager);

    m_file->GetListAcc(m_userInfo);

    for(int i = 0; i < m_userInfo.length(); i++)
    {
        StartChecking(m_userInfo.at(i), m_listInfo);
    }
}

Код:

   void MainWindow::on_pushButton_clicked()
{
    double betMoney = 0.0;
    .......
    emit Ready();
}

Подскажите может кто-то увидит, в чем проблема
Записан
Zusykss
Гость
« Ответ #1 : Июль 14, 2017, 09:45 »

Еще одна из проблем с этим проектом
Иногда после запуска, начинает вылетать ошибка
:-1: ошибка: cannot open output file debug\AppPoker.exe: Permission denied

Смотрю в task manager, там это приложение не висит, пытаюсь его удалить в ручную пишет, что нет доступа к нему
Не могу понять, из-за чего такое поведение, но предпологаю что ошибка с сигналами и слотами как-то связонно с этим....

В других проектах сигналы и слоты работают нормально.
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 132


Просмотр профиля
« Ответ #2 : Июль 14, 2017, 10:25 »

А почему бы не связать сигнал MainWindow::Ready со слотом Presenter::StartWork напрямую? Зачем эта подозрительная конструкция с соединением сигнал/сигнал?
Записан
Zusykss
Гость
« Ответ #3 : Июль 14, 2017, 10:26 »

Я так делал, и все равно не работало, решил попробовать через сигнал сделать...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Июль 14, 2017, 10:29 »

:-1: ошибка: cannot open output file debug\AppPoker.exe: Permission denied
Подобное поведение с определёнными версиями gdb наблюдал, но причину проблемы не нашёл. У меня решалось через Debug->abort debugging.

По основному вопросу: есть ли уверенность, что Ready() вызывается. QObject::connect возвращает результат связки. Предлагаю в qDebug() вывести его.
Записан
Zusykss
Гость
« Ответ #5 : Июль 14, 2017, 10:45 »

Возвращает true Непонимающий
Записан
Zusykss
Гость
« Ответ #6 : Июль 14, 2017, 10:52 »

сделал так
connect(window, &MainWindow::Beginning, &m_loop, &QEventLoop::quit);
    window->show();
    m_loop.exec();

с QEventLoop работает
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Июль 14, 2017, 10:55 »

Ready() точно вызывается?
Записан
Zusykss
Гость
« Ответ #8 : Июль 14, 2017, 11:06 »

Я проверил connect, возвращал true, изменил просто название на Beginning, и связал со слотом QEventLoop::Quit. И заработало...

Может что-то со слотом StartWork(); ....
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #9 : Июль 14, 2017, 11:39 »

Код:

   void MainWindow::on_pushButton_clicked()
{
    double betMoney = 0.0;
    .......
    emit Ready();
}

Предлагаю поставить брэйкпоинт на emit Ready(); и убедиться, что программа доходит до этого места по нажатию на кнопку.
Записан
Zusykss
Гость
« Ответ #10 : Июль 14, 2017, 17:44 »

Код:

   void MainWindow::on_pushButton_clicked()
{
    double betMoney = 0.0;
    .......
    emit Ready();
}



Предлагаю поставить брэйкпоинт на emit Ready(); и убедиться, что программа доходит до этого места по нажатию на кнопку.

Проверял, доходит до этого места....

Просто не могу понять чего слот QEventLoop работает, а мой слот не запускается ...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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