Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ СИГНАЛ в главном потоке, СЛОТ - в дочернем

Автор: pelican 31.8.2009, 16:06

Привет всем! Собственно, вопрос в заголовке...
Я пытался вызвать connect() в конструкторе класса главного окна. Сам класс потока объявлен в отдельном заголовке.

...
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ...
    connect(ui->actionOpen, SIGNAL(triggered()), addThread, SLOT(add()), Qt::QueuedConnection);
    ...
}
...

Проект компилируется, запускается, но connect() не срабатывает и консоль выводит:
Object::connect: No such slot QThread::add() in .\mainwindow.cpp:28
Object::connect:  (sender name:   'actionOpen')

В потоковой функции run(), только функция exec() (извините за тавтологию).
Подозреваю, что connect() лучше вызвать в run(). Но, чтобы не "лепить", решил спросить.

Автор: kwisp 31.8.2009, 16:23

pelican,
по-моему библиотека говорит тебе что нет может слот найти. причем тут в каком месте ты соединяешь сигнал со слотом.
Шлее пишет что можно соединять где хочешь.(зачеркнуто, я этого не говрил. :) )

Автор: pelican 31.8.2009, 16:30

Цитата
по-моему библиотека говорит тебе что нет может слот найти. причем тут в каком месте ты соединяешь сигнал со слотом.
Шлее пишет что можно соединять где хочешь.

Да, это я понял, но слот есть! Только в файле класса потока "addthread.cpp". Почему слот ищется в "mainwindow.cpp"?

Автор: kwisp 31.8.2009, 16:33

http://www.forum.crossplatform.ru/index.php?showtopic=2865&hl=%EF%EE%F2%EE%EA+%EE%F2%EE%E1%F0%E0%E6%E5%ED%E8%E5
пользуйся поиском:)

Автор: pelican 31.8.2009, 16:43

Цитата
вот

:yes: Это я видел...
Ладно, сам лопатить буду. :sad2:

Автор: Litkevich Yuriy 31.8.2009, 17:44

Цитата(pelican @ 31.8.2009, 20:06) *
Object::connect: No such slot QThread::add() in .\mainwindow.cpp:28
по моему выделенное более интересно

Автор: pelican 1.9.2009, 12:44

Цитата(Litkevich Yuriy @ 31.8.2009, 18:44) *
Цитата(pelican @ 31.8.2009, 20:06) *
Object::connect: No such slot QThread::add() in .\mainwindow.cpp:28
по моему выделенное более интересно

Вкурил доки - добавил Q_OBJECT в определение класса потока, подтесал ещё кое-что по мелочам. И всё заработало! :) Спасибо за внимание.

Автор: gigabyte 1.9.2009, 17:05

Цитата(pelican @ 1.9.2009, 12:44) *
Цитата(Litkevich Yuriy @ 31.8.2009, 18:44) *
Цитата(pelican @ 31.8.2009, 20:06) *
Object::connect: No such slot QThread::add() in .\mainwindow.cpp:28
по моему выделенное более интересно

Вкурил доки - добавил Q_OBJECT в определение класса потока, подтесал ещё кое-что по мелочам. И всё заработало! :) Спасибо за внимание.

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

Автор: pelican 1.9.2009, 17:31

Цитата(gigabyte @ 1.9.2009, 18:05) *
В идеале результат можно было бы выставить сюда в виде заголовка класса, чтоб те у кого появится эта проблема в дальнейшем видели решение, а не по новой плодили подобные темы

#ifndef ADDTHREAD_H
#define ADDTHREAD_H

#include <QThread>
#include <QMutex>
#include <QStringList>

class AddThread : public QThread
{
    Q_OBJECT

public:
    AddThread();
    ~AddThread();

protected:
    void run(void);

private:
    QMutex mutex;

public slots:
    void open(QStringList filelist);
    void add(QStringList filelist);

};

#endif // ADDTHREAD_H

Автор: reich 2.9.2009, 9:41

Без определения макроса Q_OBJECT в классе не будут доступны ключевые слова Qt типа signals, slots, emit и т.п. Потому, не забывайте определять Q_OBJECT в том классе, в котором хотите использовать сигналы/слоты

Автор: kwisp 2.9.2009, 12:06

http://www.qtcentre.org/forum/f-qt-programming-2/t-threads-signals-and-slots-23725.html

Автор: sploid 2.9.2009, 17:24

pelican, маленькое замечание, слот вызовется не в созданном потоке, а в главном потоке.

Автор: BRE 2.9.2009, 18:28

Цитата(sploid @ 2.9.2009, 18:24) *
pelican, маленькое замечание, слот вызовется не в созданном потоке, а в главном потоке.

Уточнение: слот будет выполняться в контексте того потока из которого будет вызван. Если будет вызван из run() потока, то выполнится в контексте потока. Если объект наследник от QThread будет перемещен в контекст потока (QObject::moveToThread), то так-же будет выполняться в контексте потока.

Автор: pelican 2.9.2009, 18:44

sploid, BRE, об этом я уже читал. И сразу в конструкторе прописал, чтоб не забыть )))

AddThread::AddThread()
{
    moveToThread(this);
}

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)