crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> QThread: изменение элементов QDialog, Красивое решение.
ViGOur
  опции профиля:
сообщение 29.3.2009, 20:19
Сообщение #11


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


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

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


Студент
*

Группа: Новичок
Сообщений: 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
Сообщение #13


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

Группа: Участник
Сообщений: 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
  опции профиля:
сообщение 29.3.2009, 22:13
Сообщение #14


Студент
*

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

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




Репутация:   0  


Хорошо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 30.3.2009, 1:55
Сообщение #15


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


2 canavar Внимательние читайте предыдущие сообщения. Нельзя работать с виджетами в дочернем потоке.

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

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

Привыкаем к следущему объявлению
void add(const QString &a)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость__canavar_*
сообщение 30.3.2009, 13:43
Сообщение #16





Гости








    


Огромное спасибо! Теперь стало понятно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 7.12.2021, 15:31