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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Соединение сигналов и слотов между потоками  (Прочитано 4949 раз)
agm
Гость
« : Ноябрь 26, 2010, 17:06 »

Есть простая форма отнаследованная от QWidget. В ней по нажатию кнопки запускаем некий набор действий (операции с файлами). Все эти действия реализованы в классе отнаследованном QThread.
Поток запускаем из формы.
в констркуторе формы соединяю ее с потоком так:
connect(&proc, SIGNAL(sign(int)),SLOT(t(int)));
в итоге такая ошибка:
error: expected primary-expression before ',' token
в чем может быть проблемма?
Записан
RedDog
Гость
« Ответ #1 : Ноябрь 26, 2010, 17:19 »

Посылатель сигнала есть в connect, а получателя нету.
Код:
connect(&proc, SIGNAL(sign(int)) /*вот тут*/,SLOT(t(int)));
Записан
agm
Гость
« Ответ #2 : Ноябрь 26, 2010, 17:27 »

пробовал так
connect(&proc, SIGNAL(sign(int)), this ,SLOT(t(int)));
тоже самое
Записан
RedDog
Гость
« Ответ #3 : Ноябрь 26, 2010, 18:10 »

весь код покажи
Записан
agm
Гость
« Ответ #4 : Ноябрь 29, 2010, 11:13 »

Пишу подробнее, вот класс формы
Код:
class FileFinder : public QWidget {
    Q_OBJECT
private:
    QLineEdit* m_ptxtDir;
    QLineEdit* m_ptxtMask;
    QTextEdit* m_ptxtResult;
    QLCDNumber* lcd;
    QString pathR;
    QFile file;
    QString name_of_dir;
    QString name_new;
    QDir dir;
    proc thread; //  создаем объект класса потока
public:
    FileFinder(QWidget* pwgt = 0);   
    void start(const QDir& dir);
    void runF(const QDir& dir);   
public slots:
    void slotFind  ();
    void slotBrowse();
    void t(int);   // слот который будем моединять с потоком
};

в конструкторе формы соединяем сигнал из потока со слотом в форме
Код:
  connect(&proc, SIGNAL(sign(int)),this,SLOT(t(int)));
длее зглушка слота, и запускаем поток по нажатию кнопки
Код:
void FileFinder::t(int w)
{
}
// ----------------------------------------------------------------------
void FileFinder::slotFind()
{
    dir = QDir(m_ptxtDir->text());
    QStringList listFiles = dir.entryList(m_ptxtMask->text().split(" "), QDir::Files);   
      thread.setProc(listFiles, m_ptxtDir->text());
    thread.start();
}

класс потока
Код:
class proc : public QThread
{
Q_OBJECT
private:   
    int m_nValue;
public:
    explicit proc(QObject *p2=0);
    void setProc(QStringList, QString);
    void run();

signals:
     void sign(int); // сигнал из потока
};

сигнал sign(int) вызываем в методе run как emit sign(j);

Возможно то, что я хочу  делается совсем не так?
Похожего примера не нашел пока, может кто ссылку даст.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Ноябрь 29, 2010, 11:45 »

Ну класс потока у вас живет в главном потоке. Ищите по форуму, я задолбался уже выкладывать ту ссылку, как правильно с потоками в Qt работать (кстати надо бы доку им поправить, а то там для старых версий пример)
Чтобы работали сигналы/слоты нужен exec()
added: последний раз выкладываю http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/
« Последнее редактирование: Ноябрь 29, 2010, 11:55 от Авварон » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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