2010-10-25 2 views
0

Я разрабатываю программное обеспечение для сбора изображений. Я хочу запустить функцию отображения в отдельном потоке (чтобы обеспечить живой просмотр для легкого захвата изображения). На данный момент я подклассифицирую QObject, создавая DisplayObject и используя функцию QThread :: moveToThread. Проблема заключается в том, что DisplayObject должен взаимодействовать с графическим интерфейсом (изображения должны отображаться в объектах QGraphicsView). Какой лучший (и самый элегантный) способ сделать это?QThread взаимодействие с графическим интерфейсом

Мое текущее решение:

class DisplayObject : public QObject 
{ 
    Q_OBJECT 
    public: 
     inline void addDetectorSystem(cci::PGR* system); 
     inline void connectGui(ImageAquisition* gui); 

    public slots: 
     void display(); 

    private: 
     cci::PGR* camSystem; 
     ImageAquisition* guiClass; 
}; 

DisplayObject инициализируется, как показано ниже:

DisplayObject Displayer; 
     Displayer.addDetectorSystem(PGRSystem); 
     Displayer.connectGui(this); 
     QThread thread; 
     Displayer.moveToThread(&thread); 
     connect(this, SIGNAL(display()), &Displayer, SLOT(display())); 
     thread.start(); 

Я забыл признать, что он не работает ...

+0

Какова область действия этого кода: DisplayObject Displayer; Displayer.addDetectorSystem (PGRSystem); Displayer.connectGui (это); QThread thread; Displayer.moveToThread (& thread); connect (это, СИГНАЛ (дисплей()) и Displayer, SLOT (дисплей())); thread.start(); –

+0

Эти инициализации включены в конструктор класса ImageAquisition (основной класс GUI). – Marcin

ответ

2

Вы можете использовать QImage в потоках без пользовательского интерфейса. Это позволит вам сделать ваш захват/рисунок для изображения. Как только изображение будет готово к отображению, вы можете затем испустить сигнал с изображением. Ваш элемент пользовательского интерфейса должен иметь слот, подключенный к этому сигналу, который принимает заданное изображение и обновляется, чтобы нарисовать это изображение.

Используя сигналы и слоты, данные должны передаваться поточно-безопасным способом. Используя QImages в других потоках, вы можете рисовать, а основной пользовательский интерфейс отвечает только за обновление созданных изображений, вместо того, чтобы тратить много времени на их обработку.

+1

Вот пример того, что сказал Калеб: http://qt-project.org/doc/qt-4.8/threads-mandelbrot.html –

1

Обычно графический интерфейс основной поток и любая работа выполняется в фоновом потоке.
Это связано с тем, что основной поток должен обрабатывать мышь, перерисовывать, отображать события и т. Д.

Приятная вещь о Qt заключается в том, что вы можете отправлять слоты/сигналы между потоками.

См. threading in qt для обзора.

Существует также хороший новый advanced Qt book, который охватывает threadign подробно