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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: из потока к потоку UI  (Прочитано 5186 раз)
bukum
Гость
« : Декабрь 02, 2010, 19:30 »

hi
как можно из потока обратиться к компоненту управления?
то есть в потоке выполняется

Код:
double f=sin(ui->lineEdit->text());

не катит так как поток ниче про ui не знает.
ТО есть:

Код:
class CalcThread : public QThread
{
public:
    void run();
};

void CalcThread::run()
{
double f=sin(ui->lineEdit->text());

}
Записан
BRE
Гость
« Ответ #1 : Декабрь 02, 2010, 19:54 »

Ой, вариантов масса. Можно в конструкторе передать в качестве параметра, можно сделать слот-сеттер, устанавливающий этот параметр, много как можно. Все зависит от задачи.
Записан
bukum
Гость
« Ответ #2 : Декабрь 02, 2010, 20:05 »

ну задача простая.
Есть формочка в ней lineEdit и pushButton
и есть  вторая формочка на которой лейбл.

Также есть 2 потока которые я объявил(как классы) в *.cpp 1 формы(после деструктора).

Ну и надо сделать следующее:
В lineEdit  ввести значение (5 н-р). Потом поток 1 получает это значение и обрабатывает(ну синус находит).
А потом поток 2 выводит результат в лейбл формы номер два.
Записан
BRE
Гость
« Ответ #3 : Декабрь 02, 2010, 20:12 »

Ну так в конструкторе CalcThread передавай его в качестве параметра, сохраняй это значение в переменной класса и используй его в run().
А результат, после вычислений, отправляй сигналом.
Записан
bukum
Гость
« Ответ #4 : Декабрь 03, 2010, 00:07 »

дело в том что это значение в lineEdit я могу  менять. Конструктор объекта создается 1 раз(когда объект создается)  и  я не могу его использовать вроде как...
Записан
BRE
Гость
« Ответ #5 : Декабрь 03, 2010, 09:07 »

дело в том что это значение в lineEdit я могу  менять. Конструктор объекта создается 1 раз(когда объект создается)  и  я не могу его использовать вроде как...
Как я понял работу программы:
Пользователь ввел значение и нажал кнопку, создается объект CalcThread в который передается введенное пользователем число, запускается поток производящий вычисления, объект потока разрушается. Дальше пользователь меняет значение, жмет кнопку и все повторяется.
Записан
bukum
Гость
« Ответ #6 : Декабрь 03, 2010, 10:48 »

нельзя объект разрушать. Получиться что я по сто раз создаю потоки. Надо 1 раз создать 2 потока и не трогать их. А потом меняя параметр LineEdit просто добиться того  чтобы один из потоков принимал его значение(можно синхронизацию сделать  даже). Я хз я в Куте не  так давно, может Статик спецификаторы какие нить можно использовать...
Записан
BRE
Гость
« Ответ #7 : Декабрь 03, 2010, 11:00 »

нельзя объект разрушать. Получиться что я по сто раз создаю потоки. Надо 1 раз создать 2 потока и не трогать их. А потом меняя параметр LineEdit просто добиться того  чтобы один из потоков принимал его значение(можно синхронизацию сделать  даже). Я хз я в Куте не  так давно, может Статик спецификаторы какие нить можно использовать...
Ну во первых, поток создается не при конструировании объекта CalcThread, а при вызове его метода start, а разрушается поток при завершении работы метода run. Сам объект может существовать дальше, но потока уже не будет.
Во вторых, если нужно запустить поток так, что бы он продолжал работать после выполнения вычислений (правда, для чего?), то нужно использовать какой-то цикл в run. При таком подходе новые значения можно передавать через сигналы или очередь заданий. Также можно воспользоваться QThreadPool.

Записан
bukum
Гость
« Ответ #8 : Декабрь 03, 2010, 21:27 »

ага, ну я в принципе хочу сделать через сигналы. По логике
я делаю сигнал который испускает из GUI потока в простой поток(в котором считается),
Затем 2 сигнал из 1 потока получает значение во второй. И потом 3 сигнал из 2 потока  выводит во  второй поток GUI ?

То есть 3  сигнала понадобиться.
 У меня 2 формы ,я не делал в коде(наследование виджета). Я 2 формы сделал в куте дизайнере .

И вот что не понимаю
    QObject::connect(this, SIGNAL(SliderAScroll(int)), 2 формы LineEdit, SLOT(setText(int)));

что писать в 3 параметре?
 Просто так вышло что у 1 формы и 2 определителем будет ui.

то есть
MainWindow.cpp
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

Dialog.cpp
Код:
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
то есть и там и сям  ui.

можно в main написать
 QObject::connect(&w, SIGNAL(SliderBScroll(int)), &r.ui, SLOT(setText(QString)));

но  после &r.ui  ничего не видит и при -> .... Public в *.h 
Код:
public:
    Ui::Dialog *ui;
 
  
« Последнее редактирование: Декабрь 03, 2010, 22:41 от bukum » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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