[Megoldva] Qt4.5 GUI elérése szálból

 ( hanischz | 2009. június 11., csütörtök - 8:04 )

Ü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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Ha valami signal, azt definialni kell a class headerjeben, igy:

class Akarmi : public QObject {
    Q_OBJECT
    public:
        Akarmi() {}
        ~Akarmi() {}
    //  ...
    Q_SIGNALS:  // Ide johet "signals:" is, bar az en verziom a standard a KDE-s cuccoknal.
        void setValue(int v);

};

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 :-)
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

+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:

class workThread : public QThread
{
    Q_OBJECT
    
    private:
        bool exit;
        int count;

    public:
        workThread();
        void run();
        void stop();

    signals:
        void setValue(int v);
};

--
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.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.