crossplatform.ru

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

> QThread: изменение элементов QDialog, Красивое решение.
canavar
  опции профиля:
сообщение 29.3.2009, 17:40
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 26.3.2009
Пользователь №: 643

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем доброго вечера.

Есть такая проблема: Существует окно QDialog. При загрузке этого окна происходят довольно тяжелые вычисления и, как следствие, окно замораживается. Элементов на форме 6 штук ( два QTableWidget, четыре QListWidget). Хотелось бы вынести все вычисления в отдельный поток.

Но я не понимаю, как сделать так, чтобы второй поток смог изменять Widget'ы на форме QDialog. Можно конечно в поток передавать указатели на Widget'ы, но у меня есть подозрение, что существует более красивое решение...

Что вы можете сказать по этому поводу?

Заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
canavar
  опции профиля:
сообщение 29.3.2009, 20:36
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 26.3.2009
Пользователь №: 643

Спасибо сказали: 0 раз(а)




Репутация:   0  


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;


Сообщение отредактировал Admin - 29.3.2009, 23:24
Причина редактирования: Добавил тег expand
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 29.3.2009, 21:39
Сообщение #3


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Цитата(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 ]

Сообщение отредактировал trdm - 29.3.2009, 21:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- canavar   QThread: изменение элементов QDialog   29.3.2009, 17:40
- - ViGOur   Цитата(canavar @ 29.3.2009, 18:40) Но я н...   29.3.2009, 17:46
- - Litkevich Yuriy   А ещё лучше использовать сигналы и слоты.   29.3.2009, 17:48
- - canavar   Под красивым решением имеется ввиду... кхм... не о...   29.3.2009, 17:53
- - Litkevich Yuriy   Цитата(canavar @ 29.3.2009, 21:53) Нет ни...   29.3.2009, 17:57
- - canavar   Что-то типа: while(!stopped) { } Есл...   29.3.2009, 18:00
- - igor_bogomolov   Цитата(canavar @ 29.3.2009, 18:40) Но я н...   29.3.2009, 18:11
- - ViGOur   Цитата(igor_bogomolov @ 29.3.2009, 19:11)...   29.3.2009, 19:46
- - igor_bogomolov   ИМХО. Я так понимаю, что это от реализации програ...   29.3.2009, 20:03
- - canavar   Спасибо за ответы. Так можно узнать почему, если...   29.3.2009, 20:07
- - ViGOur   Цитата(igor_bogomolov @ 29.3.2009, 21:03)...   29.3.2009, 20:19
- - canavar   ManageThread.h/* * ManageThread.h * * Created ...   29.3.2009, 20:36
|- - trdm   Цитата(canavar @ 29.3.2009, 21:36) Manage...   29.3.2009, 21:39
- - canavar   Хорошо.   29.3.2009, 22:13
- - igor_bogomolov   2 canavar Внимательние читайте предыдущие сообщен...   30.3.2009, 1:55
- - _canavar   Огромное спасибо! Теперь стало понятно.   30.3.2009, 13:43


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.1.2022, 14:02