Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Senia_Bezrubashkin от Октябрь 05, 2013, 18:01



Название: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 05, 2013, 18:01
Данные используются, и в интерфейсе пользователя (отображаются в текстовом поле), и в логике приложения (производятся вычисления)... логика и интерфейс разнесены по разным классам. Как разрешить ситуацию с общими данными?... Отдельно в заголовочном файле определить и линковать к каждому из классов? Или есть еще какой способ?
Заранее спасибо.


Название: Re: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 09, 2013, 12:51
Есть два класса:
Код:
class Widget : public QWidget
class Thread : public QThread
Из первого во второй передаю данные (слот Widget'а вызывает слот Thread'а и обрабатывает их):
Код:
void Widget::slotFind(const QModelIndex &index)
{
    QDir dir = QDir(model.filePath(index));
    emit signal_consider(dir);

    QObject::connect(this, SIGNAL(signal_consider(const QDir &)), thread,
                                    SLOT(slot_consider(const QDir &)));
    thread->start();
}
Как вернуть данные обратно... в основной поток? И второй вопрос... после клика на директории должен вызываться слот, но ничего не происходит. После второго клика слот отрабатывает как надо. После третьего клика слот отрабатывает два раза, после четвертого - три и т.д. Что не так делаю?
Заранее спасибо.


Название: Re: интерфейс, логика и общие данные
Отправлено: mutineer от Октябрь 09, 2013, 13:07
после клика на директории должен вызываться слот, но ничего не происходит. После второго клика слот отрабатывает как надо. После третьего клика слот отрабатывает два раза, после четвертого - три и т.д. Что не так делаю?
Заранее спасибо.
Коннект производишь в обработчике клика, скорее всего

Если клик на директории - это вызов slotFind, а нужный слот это slot_consider, то ошибка еще и в том, что сигнал высылается до его присоединения к слоту


Название: Re: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 09, 2013, 13:45
Коннект производишь в обработчике клика, скорее всего
Да, слот slotFind обработчик клика:
Код:
QObject::connect(treeView_1, SIGNAL(clicked(const QModelIndex &)), this,
                     SLOT(slotFind(const QModelIndex &)));
и в нем сигнал для slot_consider'а эмичу. А что с ним не так? Сигнал поставил после коннекта... срабатывает вроде сразу, но все равно с каждым следующим кликом увеличивается число вызовов слота.


Название: Re: интерфейс, логика и общие данные
Отправлено: mutineer от Октябрь 09, 2013, 13:53
Потому что сколько раз сигнал со слотом соединишь, столько раз слот и вызовется на одну высылку сигнала


Название: Re: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 09, 2013, 14:00
Потому что сколько раз сигнал со слотом соединишь, столько раз слот и вызовется на одну высылку сигнала
Так у меня одно соединение.


Название: Re: интерфейс, логика и общие данные
Отправлено: mutineer от Октябрь 09, 2013, 14:02
Потому что сколько раз сигнал со слотом соединишь, столько раз слот и вызовется на одну высылку сигнала
Так у меня одно соединение.

Ты при каждом клике вызываешь connect, поэтому количество соединений увеличивается


Название: Re: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 09, 2013, 14:53
disconnect() разрешил ситуацию... сенкс.


Название: Re: интерфейс, логика и общие данные
Отправлено: mutineer от Октябрь 09, 2013, 14:54
Жуть. Почему бы не соединиться только одни раз, вне этого слота?


Название: Re: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 09, 2013, 15:01
индекс не могу получить вне слота который обрабатывает клик.


Название: Re: интерфейс, логика и общие данные
Отправлено: mutineer от Октябрь 09, 2013, 15:18
Для коннекта индекс не нужен


Название: Re: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 09, 2013, 15:32
но мне нужен сигнал, который эмитится с переменной dir, а она формируется на основе конкретного индекса.


Название: Re: интерфейс, логика и общие данные
Отправлено: mutineer от Октябрь 09, 2013, 15:33
Ну так emit делай в слоте, а коннект один раз вне слота


Название: Re: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 09, 2013, 15:43
Ну так emit делай в слоте, а коннект один раз вне слота
Ну, так и сделал...


Название: Re: интерфейс, логика и общие данные
Отправлено: mutineer от Октябрь 09, 2013, 15:47
А первый твой вопрос лично мне непонятен


Название: Re: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 09, 2013, 15:55
Мне нужно данные после обработки из потока обратно вернуть (в основной поток)... а пока замкнутый круг... в Widget'е объявляю Thread, чтобы их туда переслать, а чтобы их обратно, типа,  вернуть нужно в Thread'е Widget объявлять... других идей не приходит в голову.


Название: Re: интерфейс, логика и общие данные
Отправлено: mutineer от Октябрь 09, 2013, 15:59
connect тебе в этом поможет - высылаешь из треда сигнал с данными и ловишь его в виджете


Название: Re: интерфейс, логика и общие данные
Отправлено: Senia_Bezrubashkin от Октябрь 09, 2013, 16:00
все получилось... спасибо.