close

 

 

 

dialog.h

 

#ifndef DIALOG_H
#define DIALOG_H
#include <mythread.h>
#include <QDialog>
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = nullptr);
    ~Dialog();
 
    MyThread *mThread;
 
private:
    Ui::Dialog *ui;
public slots:
    void onNumberChange(int);
private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
};
 
#endif // DIALOG_H

 

 

 

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    mThread = new MyThread(this);
    connect(mThread,SIGNAL(NumberChanged(int)) ,this,SLOT(onNumberChange(int)));
}
 
Dialog::~Dialog()
{
    delete ui;
}
 
 
void Dialog::onNumberChange(int Number)
{
    ui->label->setText(QString::number(Number));
}
 
void Dialog::on_pushButton_clicked()
{
    // Started
    mThread->start();
 
}
 
void Dialog::on_pushButton_2_clicked()
{
    // Stopped
    mThread->Stop = true;
}
 

 

 

mythread.h

 

#ifndef MYTHREAD_H
#define MYTHREAD_H
 
#include <QWidget>
#include <QThread>
 
 
class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
    void run();
    bool Stop;
signals:
    void NumberChanged(int);
public slots:
 
};
 
#endif // MYTHREAD_H
 

 

mythread.cpp

#include "mythread.h"
 
#include <QtCore>
#include <QMutex>
 
 
MyThread::MyThread(QObject *parent):
    QThread (parent)
{
 
}
 
void MyThread::run()
{
    for(int i = 0 ; i < 10000 ; i++)
    {
        QMutex mutex;
        mutex.lock();
 
        if (this->Stop) break;
 
        mutex.unlock();
 
 
        emit NumberChanged(i);
        this->msleep(100);
 
    }
}

 

 

 

這邊來講解一下所謂的emit , signals, slot

 

signal & slot 是Qt自行定義的一種通信機制,它獨立於標準的C/C++語言,因此要正確的處理Signal和Slot,必須要借助一個稱為moc (Meta Object Compiler )的QT工具,而該工具是一個C++預處理程式,它為高層次的事件處理自動聲程所需要的附加代碼。

 

 

窗口小原件(Widget)都有一個callback function用於response他們能夠觸發的每一個動作,這個callbackfunc通常是一個指向某個function的pointer。彈是在QT的signal 和 slot取代了這些function pointer,也就使得我們在寫這些通信程式更簡結。

 

所有從QObject或其子類 ( EX: QWidget )派生的類都能夠包含Signals & Slot。 當對象改變其狀態時,Signal由該對向 發射(emit) 出去,這就是對象所要做的全部事情。

 

 

 

 

 

 

 
arrow
arrow
    全站熱搜

    Eric 發表在 痞客邦 留言(0) 人氣()