Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Zusykss от Июль 14, 2017, 09:29



Название: Не срабатывает слот
Отправлено: 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();
}

Подскажите может кто-то увидит, в чем проблема


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

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

В других проектах сигналы и слоты работают нормально.


Название: Re: Не срабатывает слот
Отправлено: Apktyc от Июль 14, 2017, 10:25
А почему бы не связать сигнал MainWindow::Ready со слотом Presenter::StartWork напрямую? Зачем эта подозрительная конструкция с соединением сигнал/сигнал?


Название: Re: Не срабатывает слот
Отправлено: Zusykss от Июль 14, 2017, 10:26
Я так делал, и все равно не работало, решил попробовать через сигнал сделать...


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

По основному вопросу: есть ли уверенность, что Ready() вызывается. QObject::connect возвращает результат связки. Предлагаю в qDebug() вывести его.


Название: Re: Не срабатывает слот
Отправлено: Zusykss от Июль 14, 2017, 10:45
Возвращает true ???


Название: Re: Не срабатывает слот
Отправлено: Zusykss от Июль 14, 2017, 10:52
сделал так
connect(window, &MainWindow::Beginning, &m_loop, &QEventLoop::quit);
    window->show();
    m_loop.exec();

с QEventLoop работает


Название: Re: Не срабатывает слот
Отправлено: __Heaven__ от Июль 14, 2017, 10:55
Ready() точно вызывается?


Название: Re: Не срабатывает слот
Отправлено: Zusykss от Июль 14, 2017, 11:06
Я проверил connect, возвращал true, изменил просто название на Beginning, и связал со слотом QEventLoop::Quit. И заработало...

Может что-то со слотом StartWork(); ....


Название: Re: Не срабатывает слот
Отправлено: __Heaven__ от Июль 14, 2017, 11:39
Код:

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

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


Название: Re: Не срабатывает слот
Отправлено: Zusykss от Июль 14, 2017, 17:44
Код:

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



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

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

Просто не могу понять чего слот QEventLoop работает, а мой слот не запускается ...