Версия для печати темы
Форум на 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
Цитата
вот
Это я видел...
Ладно, сам лопатить буду.
Автор: 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)