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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Изменение текущего индекса QStackedWidget из потока pthread  (Прочитано 11243 раз)
BRE
Гость
« Ответ #15 : Ноябрь 15, 2011, 16:42 »

Немного не понял... Покажите на примере, please...
Нельзя дергать слот виджета из другого потока напрямую:
Код
C++ (Qt)
stackWidget->setCurrentIndex( 100500 );    // ТАК НЕЛЬЗЯ
 

но можно его дернуть через очередь сообщений, в этом случае он выполниться в контексте главной (GUI) нитки.
Код
C++ (Qt)
QMetaObject::invokeMethod( stackWidget, "setCurrentIndex", Qt::QueuedConnection, QGenericReturnArgument(), Q_ARG( int, 100500 ) );
 
« Последнее редактирование: Ноябрь 15, 2011, 17:12 от BRE » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #16 : Ноябрь 15, 2011, 16:46 »

допустим запускается 100 потоков. как тогда сделать синхронизацию каждого потока с гуи? (QLineEdit, QLabel)
  • Завести в производном от QThread классе сигнал, допустим, resultIsReady( const QString& ).
  • Связать этот сигнал с QLineEdit::setText( const QString& ).
  • После получения результата в потоке испускать этот сигнал resultIsReady( text_to_show ).
Записан

Qt 5.11/4.8.7 (X11/Win)
alexlogvinenkoit
Гость
« Ответ #17 : Ноябрь 15, 2011, 16:57 »

Цитировать
но можно его дернуть через очередь сообщений, в этом случае он выполниться в контексте главной (GUI) нитки.

Я попробовал, но метод возвращает false...
Вопрос на засыпку: метод нужно вызывать только из QThread или из pthread тоже можно?

P.S. Спасибо за код!
Записан
BRE
Гость
« Ответ #18 : Ноябрь 15, 2011, 17:03 »

Я попробовал, но метод возвращает false...
В консоль что нибудь пишет?
Записан
thechicho
Гость
« Ответ #19 : Ноябрь 15, 2011, 17:05 »

// Связать этот сигнал с QLineEdit::setText( const QString& ).
пример кода, плиз?
для каждого потока свой QLineEdit
я не догоняю как такую связь (без слота) осуществить В замешательстве
Записан
alexlogvinenkoit
Гость
« Ответ #20 : Ноябрь 15, 2011, 17:05 »

В консоль пишет только то, что я сам говорю писать... Т.е. если вернет true я пишу в консоль тру, если false - то false...
В остальном - никаких ошибок, warnings и т.д. Даже прога не вылетает Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #21 : Ноябрь 15, 2011, 17:07 »

// Связать этот сигнал с QLineEdit::setText( const QString& ).
пример кода, плиз?
для каждого потока свой QLineEdit
я не догоняю как такую связь (без слота) осуществить В замешательстве
Дык QLineEdit::setText() и есть слот  Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
BRE
Гость
« Ответ #22 : Ноябрь 15, 2011, 17:11 »

Попробуй так:
Код
C++ (Qt)
QMetaObject::invokeMethod( stackWidget, "setCurrentIndex", Qt::QueuedConnection, QGenericReturnArgument(), Q_ARG( int, 100500 ) );
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #23 : Ноябрь 15, 2011, 17:16 »

Попробуй так:
Код
C++ (Qt)
QMetaObject::invokeMethod( stackWidget, "setCurrentIndex", Qt::QueuedConnection, QGenericReturnArgument(), Q_ARG( int, 100500 ) );
 
Скорее всего тоже не прокатит. QGenericReturnArgument() не нужен:
Код
C++ (Qt)
QMetaObject::invokeMethod( stackWidget, "setCurrentIndex", Qt::QueuedConnection, Q_ARG( int, 0 ) );
Записан

Qt 5.11/4.8.7 (X11/Win)
thechicho
Гость
« Ответ #24 : Ноябрь 15, 2011, 17:19 »

// Дык QLineEdit::setText() и есть слот
пример кода, плиз.
QLineEdit для каждого потока свой. 10 потоков.
Записан
BRE
Гость
« Ответ #25 : Ноябрь 15, 2011, 17:26 »

Скорее всего тоже не прокатит.
Должен прокатить. Улыбающийся
Записан
alexlogvinenkoit
Гость
« Ответ #26 : Ноябрь 15, 2011, 17:28 »

Заработало!!!

Всем огромное спасибо!!! Прямо выручили!

Код:
QMetaObject::invokeMethod( stackWidget, "setCurrentIndex", Qt::QueuedConnection, Q_ARG( int, 0 ) );
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #27 : Ноябрь 15, 2011, 17:33 »

// Дык QLineEdit::setText() и есть слот
пример кода, плиз.
QLineEdit для каждого потока свой. 10 потоков.

Как-то так:
Код
C++ (Qt)
class Thread : public QThread
{
Q_OBJECT
   ...
Q_SIGNALS:
   void resultIsReady( const QString& );
 
protected:
   void run()
   {
        ...
        emit resultIsReady( "here must be resulted text" );
        ...
   }
};
 
// usage
{
   ...
   QLineEdit* le = new QLineEdit();
   Thread* thr = new Thread();
   connect( thr, SIGNAL( resultIsReady( QString ) ), le, SLOT( setText( QString ) ) );
   ...
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
thechicho
Гость
« Ответ #28 : Ноябрь 15, 2011, 18:08 »

а все допер) я ставил this, SLOT() поэтому понять не мог, почему не прокатывает  Веселый
биг сенкс Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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