crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в QThread: изменение элементов QDialog
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
_canavar Дата 30.3.2009, 13:43
  Огромное спасибо! Теперь стало понятно.
igor_bogomolov Дата 30.3.2009, 1:55
  2 canavar Внимательние читайте предыдущие сообщения. Нельзя работать с виджетами в дочернем потоке.

Что такое addItem()? У QTableWidget нет такого метода. Или там должен быть QListWidget?

В дочернем потоке нужно производить вычисления, а результат высылать через сигнал. Ловить этот сигнал в Gui потоке, и в нем устанавливать значения для таблиц и списков.

Привыкаем к следущему объявлению
void add(const QString &a)
canavar Дата 29.3.2009, 22:13
  Хорошо.
trdm Дата 29.3.2009, 21:39
 
Цитата(canavar @ 29.3.2009, 21:36) *
ManageThread.h:


Раскрывающийся текст
/*
* ManageThread.h
*
*  Created on: 28.03.2009
*      Author: canavar
*/

#ifndef MANAGETHREAD_H_
#define MANAGETHREAD_H_
#include <QThread>
#include <QObject>
#include <QtGui>

class ManageThread : public QThread
{
    Q_OBJECT

#endif /* MANAGETHREAD_H_ */



Пользуйся пожалуйста тегом [ expand ] [ / expand ]
canavar Дата 29.3.2009, 20:36
 
ManageThread.h
/*
* ManageThread.h
*
*  Created on: 28.03.2009
*      Author: canavar
*/

#ifndef MANAGETHREAD_H_
#define MANAGETHREAD_H_
#include <QThread>
#include <QObject>
#include <QtGui>

class ManageThread : public QThread
{
    Q_OBJECT

public:
    ManageThread(QObject *parent = 0);
    virtual ~ManageThread();

    inline void SetWidgetTable(QTableWidget *tbl) { _widgetTable = tbl; };

protected:
    void run();
    void customEvent(QEvent *event);

private:
    QTableWidget *_widgetTable;

    void Load();

    void add(QString a);

};

#endif /* MANAGETHREAD_H_ */

ManageThread.cpp
/*
* ManageThread.cpp
*
*  Created on: 28.03.2009
*      Author: canavar
*/

#include "ManageThread.h"

ManageThread::ManageThread(QObject *parent) : QThread(parent)
{

}

ManageThread::~ManageThread()
{

}

void ManageThread::run()
{
    // Inserting start values
    Load();

    exec();
}

void ManageThread::Load()
{
    // This function (add) is called about 1500 times...
    add("aaa");
}

// TODO: Move this in other thread
void ManageThread::add(QString a)
{
    if(desc.name().isEmpty() && (!desc.id().isEmpty()))
        _widgetTable->addItem(desc.id());
    else
        _widgetTable->addItem(desc.name());
}

void ManageThread::customEvent(QEvent *event)
{

}


Вызывается из конструктора viewer.cpp (viewer -- наследник QDialog):


    _mgThread = new ManageThread();
    _mgThread->SetWidgetTable(ui.widgetTable);
    _mgThread->start();


_mgThread объявлен в viewer.h:

private:
      ManageThread *_mgThread;
ViGOur Дата 29.3.2009, 20:19
 
Цитата(igor_bogomolov @ 29.3.2009, 21:03) *
Все равно экземпляры класса, наследовонного от QThread, будут создаваться в "Gui_class", так и коннекты между ними лучше делять тамже.
Это верно, но не всегда. Если у тебя большой проект, то лучше все же разнести по управляющим классам.

Цитата(canavar @ 29.3.2009, 21:07) *
Так можно узнать почему, если я использую exec() у меня вылезает exception, а если бесконечный цикл, то все нормально?
На вскидку пока ничего не приходит в голову. Покажи код.
canavar Дата 29.3.2009, 20:07
  Спасибо за ответы.

Так можно узнать почему, если я использую exec() у меня вылезает exception, а если бесконечный цикл, то все нормально?
igor_bogomolov Дата 29.3.2009, 20:03
  ИМХО.
Я так понимаю, что это от реализации программы зависит.
Чтобы имитировать сигнал никаких указателей не нужно. Вот уже где распологается коннект, это другое дело.
Все равно экземпляры класса, наследовонного от QThread, будут создаваться в "Gui_class", так и коннекты между ними лучше делять тамже.

connect(&thread, SIGNAL(thread_signal()), this, SLOT(gui_slot()));
ViGOur Дата 29.3.2009, 19:46
 
Цитата(igor_bogomolov @ 29.3.2009, 19:11) *
Но мы же не можем работать с виджетыми в дочернем потоке. Все работа с ними производится только в осносном Gui потоке.
Все правильно, но для того, чтобы послать сигнал какому-либо виджету нужен как минимум указатель на объект класса, который может их контролировать.

В посте выше я забыл сказать насчет сигналов и слотов, но Litkevich Yuriy меня дополнил.
igor_bogomolov Дата 29.3.2009, 18:11
 
Цитата(canavar @ 29.3.2009, 18:40) *
Но я не понимаю, как сделать так, чтобы второй поток смог изменять Widget'ы на форме QDialog. Можно конечно в поток передавать указатели на Widget'ы

Цитата(ViGOur @ 29.3.2009, 18:46) *
Без указателей ну никак не обойтись

Но мы же не можем работать с виджетыми в дочернем потоке. Все работа с ними производится только в осносном Gui потоке. :blink:
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 1.12.2021, 21:19