Witam,
Dopiero zaczynam z QT i mam takie pytanko. Jest sobie aplikacja, z gui. Jest też wątek (QThread) który coś robi w tle. Wygląda to mniej więcej tak:
backthread.h
#ifndef BACKTHREAD_H
#define BACKTHREAD_H
#include <QThread>
#include "Counter.h"
class BackThread : public QThread
{
public:
virtual void run();
private:
Counter counter;
};
#endif // BACKTHREAD_H
backthread.cpp
#include "backthread.h"
void BackThread::run()
{
int i=0;
while(1)
{
counter.setValue(i);
sleep( 1 );
qDebug( "Ping!" );
i+=10;
if(i==100) i=0;
}
}
Counter.h:
#ifndef COUNTER_H
#define COUNTER_H
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};
#endif
Counter.cpp:
#include "Counter.h"
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
I główne okno:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
BackThread th;
th.start();
}
MainWindow::~MainWindow()
{
delete ui;
}
W głównym oknie jest sobie progress bar, który powinien uaktualniać się wartościami Counter::m_value, zwiększanymi w wątku. W jaki sposób mam to osiągnąć? W klasie Counter jest emitowany sygnał valueChanged - w jaki sposób teraz go przechwycić za pomocą slota w oknie głównym? A może ten Counter jest wcale niepotrzebny i sygnały mam wysyłać z klasy BackThread?