Üdv!
Lenne egy kis problémám. Nemrégen álltam neki a qt4 megtanulásának. Namost készítettem egy kis progit, ahol háttérszálból szeretném elérni a progressbar-t, gyakorlatilag növelni 0-tól 100%ig.
Most már nagyjából értem a signals slots mehanizmust. Progim:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
class workThread *wt;
private slots:
void on_pushButton_clicked();
public slots:
void setProgressBarValue(int v);
};
Lényeges elemek:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
wt = new workThread(this);
// Itt kapcsoltam össze a setProgressBart, ami közvetlenül állítja a
// progressbar-t, illetve a szál setValue signal-ját
QObject::connect(wt, SIGNAL(setValue(int)), this,
SLOT(setProgressBarValue(int)));
}
void MainWindow::setProgressBarValue(int v)
{
ui->progressBar->setValue(v);
}
Szál definició:
class workThread : public QThread
{
private:
bool exit;
int count;
public:
workThread();
void run();
void stop();
signals:
void setValue(int v);
};
void workThread::run()
{
while(!exit)
{
msleep(50);
emit setValue(count);
if (count >= 100)count = 0;
else count++;
}
}
Persze nyomógombra indítja a szálat. Fordításkor kapom a hibaüzenetet:
undefined reference workThread::setValue(v);
PEDIG azt olvastam és értelmeztem hogy nem kell a workThread::setValue(v)-t létrehoznom mert csak signal, hanem össze van kapcsolva a MainWindow::setProgressBarValue(int v)-al.
Már kutatom a netet egy ideje de olyan példát nem találok ahol szálból a gui elemét bizergálják.
qt-s guru tudna segíteni ez ügyben?
Köszönöm!
Hozzászólások
Ha valami signal, azt definialni kell a class headerjeben, igy:
Nem mint fuggvenyt kell letrehoznod, de mint signalt legalabbis definialnod kell, kulonben a rendszer nem tudja, mirol van szo.
A moc -orgast el ne feledd :-)
--
+1 hrgy84-nek
+ Q_OBJECT makrót soha ne feledd a saját signal-okat definiáló,
QObject-ből (in)direkt módon származó (így a WorkThread) osztály(ok) deklarációja elől:
--
A gyors gondolat többet ér, mint a gyors mozdulat.
Köszönöm mindkettőtöknek, probléma a Q_OBJECT hiánya volt!
Barmilyen, Signal-Slot stuffnal kell, mert a slotokhoz is kell moc-orogni.
--